常用的正则表达式模式:
. | 匹配除换行符以外的任意字符 |
d | 匹配一个数字字符。等价于 [0-9]。 |
D | 匹配一个非数字字符。等价于 [^0-9]。 |
s | 匹配任何空白字符,包括空格、制表符、换页符等。等价于 [ f v]。 |
S | 匹配任何非空白字符。等价于 [^ f v]。 |
w | 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 |
W | 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 |
字符的开始或结束。w{6} 匹配刚好6个字符的单词 | |
^ | 匹配字符串开头 |
$ | 匹配字符串的结束 |
[^] | 取反,匹配不在[]之中的字符, 例如 [^xyz] 匹配除了x,y,z以外的字符 |
[] | [xyz],字符x或者y或者z |
? | 匹配0个或1个 |
* | 匹配0个或多个 |
+ | 匹配1个或多个 |
{} | {m}重复m次,{m,}重复m到多次,{m,n}重复m到n次 |
() | 分组 |
(?P<name>exp) | 将exp匹配到的文本命名为name |
更多详细使用可参考:https://www.jb51.net/tools/zhengze.html
re.match 匹配字符串的开始,如果不符合则返回None
re.match(pattern, string, flags=0)
>>> re.match('[a-z]','1aaa') # 没匹配到返回None >>> re.match('[a-z]','a1aaa') <_sre.SRE_Match object; span=(0, 1), match='a'> >>> re.match('[a-z]','a1aaa').group() #group()匹配到的字符串 'a' >>> re.match('[a-z]','a1aaa').span() (0, 1)
re.search 匹配整个字符串,直到找到一个匹配
>>> re.search('[a-z]','1aaa') <_sre.SRE_Match object; span=(1, 2), match='a'>
findall 匹配所有符合正则的字符串,以列表形式返回
>>> re.findall('[a-z]','ab11cd22ef33') #匹配所有符合正则的字符串,并返回列表 ['a', 'b', 'c', 'd', 'e', 'f'] >>> re.findall('[a-z]','123456') #没有匹配到则返回空列表 [] >>> pat = re.compile(r'd+') >>> pat.findall('aa 12 bb34 de') ['12', '34'] >>> pat.findall('aa 12 bb34 de56') ['12', '34', '56'] >>> >>> pat.findall('aa 12 bb34 de56',0,5) ['12']
finditer 类似findall 将结果作为一个迭代器返回
>>> pattern = re.compile(r'D+')
>>> i = pattern.finditer('ab-11cd22ef33')
>>> i
<callable_iterator object at 0x7f8fc4d38908>
>>> for x in i:
... print(x)
...
<_sre.SRE_Match object; span=(0, 3), match='ab-'>
<_sre.SRE_Match object; span=(5, 7), match='cd'>
<_sre.SRE_Match object; span=(9, 11), match='ef'>
compile 函数 编译正则表达式。
re.compile(pattern[, flags])
flags:匹配模式 re.I 忽略大小写 re.M 多行模式等
>>> pattern = re.compile(r'D+') # 先对正则进行编译,然后再匹配 >>> pattern.search('ab-11cd22ef33').group() 'ab-' >>> pattern.search('ab-11cd22ef33',0,2).group() 'ab' >>> >>> pattern.search('ab-11cd22ef33').start() 0 >>> pattern.search('ab-11cd22ef33').end() 3 >>> pattern.search('ab-11cd22ef33').span() (0, 3)
split 按照正则匹配的子串将字符串分割并返回列表
>>> re.split(r'*','a*b*c') ['a', 'b', 'c']
re.sub 查找替换
re.sub(pattern, repl, string, count=0)
>>> re.sub(r'[^a-z]','*','ab11cd22ef33')
'ab**cd**ef**'
>>> re.sub('D','*','ab11cd22ef33')
'**11**22**33'
(?P<name>exp)
>>> m = re.search('(?P<year>[0-9]{4})','this is 2018 yeara') >>> m.group('year') '2018' >>> m = re.search('(?P<year>[0-9]{4})/(?P<month>[0-9]{2})','test 2012/12 year haha') >>> m.group() '2018/08' >>> m.group('year') '2018' >>> m.group('month') '08'