正则表达式模块,用于匹配特定字符串等功能。
正则表达式的优势
找到规律后定制规则,方便
匹配方式
re.findall # 把所有匹配到的字符放到列表中返回
re.match # 从头开始匹配,找到就返回,类似startswith
re.split # 以满足规则的作为分隔符
re.search # 全局匹配找到一个就不找了
re.sub # 匹配字符并替换
re.fullmatch # 全部匹配
常用表达式规则
符号 | 含义 | 例子 | 结果 |
---|---|---|---|
. | 匹配除了’\n’外任意一个字符,若指定flag DOTALL则匹配所有字符 | ||
^ | 匹配字符开头,若指定flags re.MULTILINE。每行分别匹配。 | re.search(r’^a’,’\nabc\neee’,flags=re.MULTILINE).group() | ’a‘ |
$ | 匹配字符结尾,若指定flags re.MULTILINE。每行分别匹配。 | re.search(r’foo.$’,‘foo1\nfoo2’,flags=re.MULTILINE).group() | ’foo1’ |
* | 匹配*前字符0或多次 | re.search(‘a’,‘aaaabac’).group() re.search(‘a’,‘ba’)->匹配不到0次,a开头ok | ‘aaaa’ |
+ | 匹配+前字符1或多次 | re.findall(‘ab+’,‘ab+cd+abb+bba’) | [‘ab’,‘abb’] |
? | 匹配前一个字符1次或0次 | re.search(‘b?’,‘alex’).group() | ‘’ (0次) |
{m} | 匹配前一个字符m次 | re.search(‘b{3}’,‘alexbbbs’).group() | ‘bbb’ |
{n,m} | 匹配前一个字符n到m次 | re.findall(‘ab{1,3}’,‘abb abc abbcbbb’) | [‘abb’,‘ab’,‘abb’] |
| | 匹配|左或|右的字符 | re.search(‘abc|ABC’,‘ABCBabcCD’).group() | ‘ABC’ |
(…) | 分组匹配 | re.search(’(abc){2}a(123|45)’,‘abcabca456c’).group() | ‘abcabca45’ |
\A | 只从字符开头匹配,相当于re.match | re.search(’\Aabc’,‘alexabc’) | 匹配不到 |
\Z | 匹配字符结尾同$ | ||
\d | 匹配数字0-9 | ||
\D | 匹配非数字 | ||
\w | 匹配[A-Za-z0-9] | ||
\W | 匹配非[A-Za-z0-9] | ||
\s | 匹配空白字符\t、\n、\r | re.search(’\s+’,‘ab\tc1\n3’).group() | ‘\t’ |
?P… | 分组匹配 | re.search(’(?P[0-9]{4})(?P[0-9]{2})(?P[0-9]{8})’,‘210302199107082173’).groupdict() .groups() | {‘province’: ‘2103’, ‘city’: ‘02’, ‘birthday’: ‘19910708’} (‘2103’,‘02’,‘19910708’) |
例子
获取手机号
import re
f = open('联系方式.txt','r',encoding='utf-8')
phone_list = re.findall("[0-9]{11}",f.read())
print(phone_list)
各种匹配方法
re.split('[0-9]','alex3jack44rain6mack')
re.findall('[0-9]+','alex3jack44rain6mack')
re.sub('abc','ABC','asdabcbasdjabc',count = 2) # 查找替换
re.fullmatch('[a-z]*','asdvasdasd').group() # 精确匹配
re.compile(pattern) # 避免很多行反复解析语法
result = prog.match(string)
Flags标志符
re.search('[0-9]','asd213',re.I)
# re.I(IGNORECASE):忽略大小写
# re.M(MULTILINE):多行模式,改变^$的行为
# re.S(DOTALL):改变.的行为,.可以匹配换行符
# re.X(VERBOSE):可以给表达式写注释
a = re.compile(r''' \d+# the intrgral part
\. # the decimal point
\d *# some fractional digits''',re.X)
b = re.compile(r'\d+\.\d*')
# a与b是一样的
练习题
计算公式中的值:
1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))