python正则表达式对字符串的查找匹配

目录

Python中的正则表达式要用到re模块,下面先介绍一下正则表达式需要用到的特殊字符和说明

常用的RegEx基础语法

语法 说明
\\d 匹配一个数字字符
\\D 匹配一个非数字字符
\\s 匹配任何不可见字符(空格、制表符、换行符等)
\\S 匹配任何可见字符
\\w 匹配任何单词字符
\\W 匹配任何非单词字符
. 匹配所有字符
^ 从字符串开头开始匹配,比如^\\d表示以一个数字字符开头
$ 从字符串末尾开始匹配,比如\\d$表示以一个数字字符结尾
* 匹配前一个字符任意次
+ 匹配前一个字符一次或多次
? 匹配前一个字符零次或一次
{m} 匹配前一个字符m次
{m,n} 匹配前一个字符最少m次最多n次
\\ 转义字符
[] 比如[a-z]表示匹配从a到z之间的所有字符串
| 或,比如A|B表示匹配A或B
() 精确匹配括号中指定的模式

常用的RegEx函数

函数 说明
search 从字符串中进行搜索,成功则返回匹配目标,失败则返回None
match 从字符串开头进行匹配,成功则返回匹配目标,失败则返回None
fullmatch 匹配整个字符串
split 根据模式分割字符串
findall 查找字符串中所有非重叠匹配
finditer 类似于findall,但返回Python迭代器
sub 用提供的字符串替代匹配模式

以下为部分示例:

对于split函数,我们在对字符串进行分割的时候可以直接调用split方法,再次不再进行

>>> import re#导入包
>>> a=\'xiaoming:wo jiao xiaoming,wo de dianhua shi +86-666666\'
>>> print(re.search(pattern=\'\\d+\\W\\d+\',string=a))
<re.Match object; span=(45, 54), match=\'86-666666\'>#此处输出的时一个match对象
 
>>> mp=re.search(pattern=\'\\d+\\W\\d+\',string=a)#查找电话号码
>>> print(mp.group())#使用group方法获取于指定模式相匹配的字符串
86-666666
>>> print(mp.start())#获取第一个匹配字符串的索引
45
>>> print(mp.end())#获取匹配字符串的
54
>>> print(mp.span())#获取索引范围
(45, 54)
 
>>> print(re.findall(pattern=\'\\w+\',string=a))
[\'xiaoming\', \'wo\', \'jiao\', \'xiaoming\', \'wo\', \'de\', \'dianhua\', \'shi\', \'86\', \'666666\']
 
>>> m_sub=re.sub(pattern=\'\\w+:\',string=a,repl=\'xiaohong:\')#模式替代,使用repl传入的字符串替代匹配到的第一个字符串
>>> print(m_sub)
xiaohong:wo jiao xiaoming,wo de dianhua shi +86-6666
 
#编译模式
>>> p=re.compile(\'\\d{6}\')#预先设定好匹配的模式
>>> m1=p.search(a)#对预先设定好的模式调用查找
>>> print(m1.group())获取查找到的字符串
666666

不区分大小写匹配字符

#! /usr/bin/python3
import re
rebocop = re.compile(r\'rebocop\', re.I)
match = rebocop.search(\'ReboCop is part man, part machine, all cop.\').group()
print(match)

管理复杂的正则表达式

如果您需要匹配的文本模式很简单,则正则表达式很好。但是匹配复杂的文本模式可能需要冗长,复杂的正则表达式。您可以通过告诉 re.compile() 函数来缓解这种情况忽略正则表达式字符串中的空格和注释。可以通过将变量 re.VERBOSE 作为传递来启用此“详细模式” re.compile()的第二个参数。

#! /usr/bin/python3
import re

phoneRegex = re.compile(r\'\'\'(
    (\\d{3}|\\(\\d{3}\\))?   # area code
    (\\s|-|\\.)?           # separator
    \\d{3}                # first 3 digits
    (\\s|-|\\.)            # separator
    \\d{4}                # last 4 digits
    (\\s*(ext|x|ext.)\\s*\\d{2,5})?   #extension
    )\'\'\', re.VERBOSE)

请注意前一个示例如何使用三引号语法(’’’)创建一个多行字符串,以便您可以将正则表达式定义分布在多行上,使其更加清晰。正则表达式字符串中的注释规则与常规Python代码:#符号及其后的所有内容线被忽略。此外,正则表达式的多行字符串内的额外空格不被视为要匹配的文本模式的一部分。这使您可以组织正则表达式,以便更容易阅读。

从粘贴板的文字中提取邮箱和手机号码

#! /usr/bin/python3
# phoneAndEmail.py - Finds phone numbers and email address on the chipboard.

import pyperclip, re

americaPhoneRegex = re.compile(r\'\'\'(
    (\\d{3}|\\(\\d{3}\\))?   # area code
    (\\s|-|\\.)?           # separator
    (\\d{3})              # first 3 digits
    (\\s|-|\\.)            # separator
    (\\d{4})              # last 4 digits
    (\\s*(ext|x|ext.)\\s*(\\d{2,5}))?   # extension
    )\'\'\', re.VERBOSE)    

chinesePhoneRegex = re.compile(r\'1\\d{10}\')

emailPhoneRegex   = re.compile(r\'\'\'(
        [a-zA-Z0-9._%+-]+      # username
        @                      # @ symbol
        [a-zA-Z0-9.-]+         # domain name
        (\\.[a-zA-Z]{2,4})      # dot-something
        )\'\'\', re.VERBOSE)


# Find matches in clipboard text.
text = str(pyperclip.paste())
matches = []
for groups in americaPhoneRegex.findall(text):
    phoneNum = \'-\'.join([groups[1], groups[3], groups[5]])
    if groups[8] != \'\':
        phoneNum += \' x\' + groups[8]
    matches.append(phoneNum)

for groups in emailPhoneRegex.findall(text):
    matches.append(groups[0])

for groups in chinesePhoneRegex.findall(text):
    matches.append(groups[0])

# copy results the clipboard. 
if len(matches) > 0:
    pyperclip.copy(\'\\n\'.join(matches))
    print(\'Copied to clipboard:\')
    print(\'\\n\'.join(matches))
else:
    print(\'No phone numbers or email addresses found.\')

总结

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容