>>> re.match('^代','代文海')
<_sre.SRE_Match object; span=(0, 1), match='代'>
>>> re.match('^代.*','代文海')
<_sre.SRE_Match object; span=(0, 3), match='代文海'>
>>> re.match('.*?海$','代文海')
<_sre.SRE_Match object; span=(0, 3), match='代文海'>
>>> re.match('.*?海12$','代文海')
>>>
- 用*表示任意个字符(包括0个),用+表示至少一个字符,用表示0个或1个字符,用{N}表示n个字符,用{N,M}表示n-m个字符,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符,可以通过加?变成非贪婪匹配。
>>> re.match('\d{2,5}','12345kk')
<_sre.SRE_Match object; span=(0, 5), match='12345'>
>>> re.match('.*?\d{2,5}','dddd12345kk')
<_sre.SRE_Match object; span=(0, 9), match='dddd12345'>
- python正则表达式特殊字符\d匹配任何十进制数字,与[0-9]意思相同,而\D匹配任何非十进制数字,正好和\d相反。
- \w匹配任何的数字或者字母,与[A-Za-z0-9]相同,而\W和\w正好相反,匹配的是任何非数字或者字母。
- \s匹配任何的空格字符,与[\n\t\r\f\v]相同,\S和正好相反(\n:换行,光标到下行行首;\t:tab,水平制表;\r:回车,移动光标到本行行首;\f:换页;\v垂直制表)。
- \A相当于^,\Z相当于$(主要用于有些没有脱字符的键盘)。
>>> re.search(r'\bthe\b','the 123')
<_sre.SRE_Match object; span=(0, 3), match='the'>
>>> re.search('\bthe\b','the123')
>>> re.search(r'the\b','the 123')
<_sre.SRE_Match object; span=(0, 3), match='the'>
>>> re.search(r'the\b','the123')
>>> re.match('.*\$$','123$')
<_sre.SRE_Match object; span=(0, 4), match='123$'>
>>> re.match('.*\$$','123$12')
>>> re.match('\$$','123$')
>>> re.search('\$$','123$')
<_sre.SRE_Match object; span=(3, 4), match='$'>
- 如果脱字符(^)紧跟在方括号后面,就表示不匹配给定字符集中的任何一个字符。
z.[0-9] //匹配字母z后面紧跟一个任意字符,然后跟一个数字
[^0-9] //匹配任何一个非数字字符
[''-,a] //匹配所有ascii值小于等于a的字符
- 我们可以使用圆括号指定分组,通过用圆括号包裹任何的正则表达式来实现。
>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')
>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')
>>>
python re模块的核心函数和方法
compile(pattern,flangs=0)使用任何可选的标记来编译正则表达式的模式,然后返回一个正则表达式对象。
match(pattern,string,flangs=0)用正则表达式去匹配对象,如果匹配成功返回匹配对象,匹配失败返回None。
search(pattern,string,flags=0)搜索字符串中第一次出现的正则表达式模式,成功则返回匹配对象。
findall(pattern,string)查找字符串中出现的所有正则表达式模式,返回一个匹配列表。
finditer(pattern,string)与findall函数相同,但返回的是一个迭代器,对于每一次的匹配,迭代器都返回一个匹配对象。
splite(pattern,string,max=0)根据给定的格式将字符串分割成子部分,然后返回成功匹配的列表,分割最多操作max次(默认分割所有匹配成功的位置。
sub(pattern,repl,string,count=0)使用repl替换所有匹配到的模式的部分,然后返回匹配成功的列表,最多替换count次,默认替换所有。
group(num=0)返回整个匹配对象,或者编号为num的子组。
groups()返回匹配成功所有匹配子组的一个元组。
groupdict()返回包含匹配成功的所有匹配子组的一个字典。
常用的模块属性
re.I,re.IGNORECASE 不区分大小写的匹配。
re.M,re.MULTILINE^和$分别匹配目标字符串中行的开始和结尾,而不是严格匹配整个字符串本身的开始和结尾。
re.S,rer.DOTALL点号通常匹配除了\n外的之外的所有单个字符,加了该标记表示能够匹配全部字符。
编译正则表达式
在模式匹配发生之前,正则表达式必须要先编译成正则表达式对象,所以在多次使用同一模式时,最好先进行正则表达式预编译来提升性能。re.compile()。模块函数会对预编译过的正则表达式进行缓存,purge()可以用来清除缓存。
>>> m=re.match('(\w\w\w)-(\d\d\d)','abc-123')
>>> m
<_sre.SRE_Match object; span=(0, 7), match='abc-123'>
>>> m.group()
'abc-123'
>>> m.group(1)
'abc'
>>> m.group(2)
'123'
>>> m.groups()
('abc', '123')
>>>
group()通常以普通的方式显示所有匹配的部分,也可以通过加参数显示各个匹配子组(从1开始而不是从0开始),groups()获取一个包含所有匹配字串的元组。
>>> it=re.findall(r'(th\w+)',s,re.I)
>>> it
['This', 'that']
>>> s='This is that'
>>> it=re.finditer(r'(th\w+)',s,re.I)
>>> g=it.__next__()
>>> g.groups()
('This',)
>>> g.group()
'This'
>>> g.group(1)
'This'
>>> g.group(2)
Traceback (most recent call last):
File "", line 1, in
g.group(2)
IndexError: no such group
>>> g=it.__next__()
>>> g.group()
'that'
>>> g.group(2)
Traceback (most recent call last):
File "", line 1, in
g.group(2)
IndexError: no such group
>>> g.group(1)
'that'
>>> [g.group(1) for g in re.finditer(r'(th\w+)',s,re.I)]
['This', 'that']
>>>
使用sub()和subn()进行所搜和替换
sub()和subn()实现的功能相同,都是将所有匹配正则表达式的部分替换为特定的形式替换,用来替换的部分可以是一个正则表达式也可以是一个函数。subn()还会返回一个替换的总次数,和替换后的字符串一起构成一个元组返回。
>>> re.sub('[ae]','X','abcdef')
'XbcdXf'
>>> re.subn('[ae]','X','abcdef')
('XbcdXf', 2)
>>> re.sub(r'(\d{1,2})/(\d{1,2})/(\d{2}|\d{4})',r'\2/\1/\3','2/20/91')
'20/2/91'
>>> re.sub(r'(\d{1,2})/(\d{1,2})/(\d{2}|\d{4})',r'\3/\1/\2','2/20/91') //'\'+数字表示第几个子组
'91/2/20'
>>>
为了防止ascii字符和正则表达式特殊字符之间存在的冲突,最好使用原始字符串,例如在python正则表达式中使用\b就会被正则表达式编译器解释成退格符,只有\\b才能被解释成边界匹配,但如果写r'\b'就会直接解释成边界匹配符。