Python正则表达式

匹配符

符号 含义
\d 数字
\w 字母或数字
\s 空白符
. 任意字符
{n}/{n,m} n个字符/n~m个字符
+ 至少一个字符
* 任意个字符
? 0个或者1个字符
[] 表示范围
^ 开头
$ 结尾

re模块

1
2
re.match(r'正则表达式','输入字符串')
re.splite(r'正则表达式','输入字符串') #切分字符串

分组

1
2
3
4
5
6
7
8
9
>>> m = re.match(r'^(\d{3})-(\d{3,8})$','010-12345')
>>> m
<_sre.SRE_Match object at 0x10054fc68>
>>> m.group(0)
'010-12345'
>>> m.group(1)
'010'
>>> m.group(2)
'12345'

贪婪匹配

正则匹配默认是贪婪匹配,也就是说会匹配尽可能多的字符。

1
2
3
4
5
6
>>> re.match(r'^(\d+)(0*)$','102300').groups()
('102300', '')
#\d+的贪婪匹配把后面的0全部匹配了,结果0*就只能匹配空字符串了
>>> re.match(r'^(\d+?)(0*)$','102300').groups()
('1023', '00')
#加个?就可以让\d+采用非贪婪匹配(也就是尽可能少地匹配)

预编译

在Python中使用正则表达式时,re模块内部会干两件事:

  1. 编译正则表达式,如果正则表达式的字符串本省不合法就会报错;
  2. 用编译后的正则表达式去匹配字符串。

如果一个正则表达式需要重复使用几千次,考虑效率,可以预编译正则表达式,接下来不需要再重复编译了,直接匹配:

1
2
3
4
5
6
>>> import re
>>> re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')
>>> re_telephone.match('010-12345').groups()
('010', '12345')
>>> re_telephone.match('010-80992').groups()
('010', '80992')

感谢网上恩师廖雪峰老师的Python教程,本文大部分内容都摘自于此。