Python 正则表达式
基础
- 用
\d
可以匹配一个数字,\w
可以匹配一个字母或数字,所以:
-
'00\d'
可以匹配'007'
,但无法匹配'00A'
; -
'\d\d\d'
可以匹配'010'
; -
'\w\w\d'
可以匹配'py3'
;
-
.
可以匹配任意字符,所以:
-
'py.'
可以匹配'pyc'
、'pyo'
、'py!'
等等。
- 匹配变长的字符
在正则表达式中,用*
表示任意个字符(包括0个),用+
表示至少一个字符,用?
表示0个或1个字符,用{n}
表示n个字符,用{n,m}
表示n-m个字符。
下面看一个具体的例子:\d{3}\s+\d{3,8}
- \d{3}表示匹配3个数字,例如'010';
- \s可以匹配一个空格(也包括Tab等空白符),所以\s+表示至少有一个空格,例如匹配' ',' '等;
- \d{3,8}表示3-8个数字,例如'1234567'。
进阶
- 用
[]
表示范围,比如:
-
[0-9a-zA-Z\_]
可以匹配一个数字、字母或者下划线; -
[0-9a-zA-Z\_]+
可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100','0_Z','Py3000'等等; -
[a-zA-Z\_][0-9a-zA-Z\_]*
可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量; -
[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}
更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。
-
A|B
可以匹配A或B,所以(P|p)ython
可以匹配'Python'
或者'python'
。 -
^
表示行的开头,^\d
表示必须以数字开头。 -
$
表示行的结束,\d$
表示必须以数字结束。
re
模块
推荐使用 Python 的r
前缀,就不用考虑转义。
切分字符串
>>>re.split(r'[\s\,\;]+', 'a,b;; c d')
['a', 'b', 'c', 'd']
分组
正则表达式有提取子串的强大功能。用()
表示的就是要提取的分组(Group)
。
>>> t = '19:05:30'
>>> m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t)
>>> m.groups()
('19', '05', '30')
贪婪匹配
正则匹配默认是贪婪匹配,也就是尽可能多的字符,例子如下:
>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')
加个?
采用非贪婪匹配:
>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')