1.基础
1.1单字符
直接给出字符,属于精确匹配。如:
\d : 匹配数字
\D:匹配非数字
\w : 匹配字母或者数字或者下划线
\W:匹配非字母或者数字或者下划线
\s : 匹配任意的空白符(空格、换行、回车、制表、换页)
\S:匹配任意的非空白符
1.2边界字符
^:行首匹配
$:行尾匹配
\A:匹配字符串开始,和^的区别是\A只匹配整个字符串的开头,即使在re.M模式下也不会匹配它行的行首
\Z:匹配字符串结束,和$的区别是\Z只匹配整个字符串的结尾,即使在re.M模式下也不会匹配它行的行尾
\b:匹配单词的边界,也就是指单词和空格间的位置,比如:'od\b'可以匹配god,不能匹配godman
\B:匹配非单词边界,od\b'可以匹配godman,不能匹配god
1.3匹配多个字符
(xyz)匹配小括号内的xyj
x? 匹配0个或者1个x
x*匹配任意个x,(.*表示匹配0个或者任意多个字符(换行符除外)
x+匹配至少一个x
x{n}匹配确定的n个x
x{n,}匹配至少n个x
x{n,m}匹配n-m个x
x | y 匹配x或y
1.4特殊用法
*? +? x? 最小匹配,通常都是贪婪匹配,可以使用这种解决贪婪匹配
[^jack]表示匹配除了jack以外的所有字符,[]中的^称为脱字符
3. re模块
python的r前缀可让系统认为字符串不需要转义,使用Python的r
前缀,就不用考虑转义的问题。
re模块使得python拥有了全部的正则表达式功能
该模块可用于判断判断正则表达式是否匹配,如果匹配,则返回一个Match
对象,否则返回None。
一般使用正则表达式时,会先使用re模块进行编译,当编译没问题后,便可进行使用:
>>> import re
# 编译:
>>> re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')
# 使用:
>>> re_telephone.match('010-12345').groups()
('010', '12345')
>>> re_telephone.match('010-8086').groups()
('010', '8086')
re的子模块常见以下:
re.match:从头开始匹配,若开始没有匹配上则返回none
re.search:扫描整个字符串,并返回第一个成功的匹配
re.findall:扫描整个字符串,并返回结果列表
re.finditer:扫描整个字符串,返回一个迭代器
re.sub:返回一个被替代的字符串
re.subn:返回一个元祖,第一个元素表示被替换的字符串,第二个元素表示被替换的次数
4.正则表达式的其它用途
4.1
切分字符串
例:
>>> re.split(r'\s+', 'a b c')
['a', 'b', 'c'
>>> re.split(r'[\s\,]+', 'a,b, c d')
['a', 'b', 'c', 'd']
>>> re.split(r'[\s\,\;]+', 'a,b;; c d')
['a', 'b', 'c', 'd']
4.2分组
例:
>>> 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')
>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
>>> m
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> m.group(0)
'010-12345'
>>> m.group(1)
'010'
>>> m.group(2)
'12345'
5.正则表达式的特性(贪婪匹配)
例:
>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')
由于\d+
采用贪婪匹配,直接把后面的0
全部匹配了,结果0*
只能匹配空字符串了。
必须让\d+
采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0
匹配出来,加个?
就可以让\d+
采用非贪婪匹配:
>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')