Python正则表达式分组优先级
正则表达式的符号
⼀.元字符
1. . 通配符:可代指任意⼀个符号,除换⾏符
import re
print(re.findall('a..x','scdcdabnxmn'))
#输出:
['abnx']
2. ^ 在字符串开头匹配
import re
print(re.findall('^a..x','ascxdcdabnxmn'))
#输出
['ascx']
3. $ 在字符串结尾匹配
import re
print(re.findall('a..x$','ascxdcdabnxamnx'))
['amnx']
4.
1. 重复0到⽆穷次
import re
print(re.findall('m*','ascxdcmmmmmdabnxamnx'))
#输出
['', '', '', '', '', '', 'mmmmm', '', '', '', '', '', '', 'm', '', '', '']
5.
1. 重复1到⽆穷次
import re
print(re.findall('m+','ascxdcmmmmmdabnxamnx'))
#输出
['mmmmm', 'm']
6. ?结尾数据匹配0或1次
import re
print(re.findall('xdc?','ascxdcccmmmmmdabnxamnx'))
#输出
['xdc']
7. {a,b} 结尾数据匹配 a到b次
import re
print(re.findall('xdm{2,3}','ascxdmmmmmdabnxxdmmnx'))
#输出
'xdmmm', 'xdmm']
8. []或, []中不可加元字符。在[]中有特殊意义的字符有:-(表⽰范围),^(表⽰取反),\ (表⽰转义,去格式化)
import re
print(re.findall('x[yz]','hiuhwfxyndvkfjxz'))
#输出
['xy', 'xz']
9. \ 表⽰转义符,放在特殊字符前可将特殊字符变成普通字符
10. | 或 表⽰或:
import re
s='abekwjbnkcdndnv'
print(re.findall('kw|c',s))
#输出:
['kw', 'c']
11. ()表⽰分组,分组内的内容为整体
import re
print(re.findall('x(dm)','ascxdmxdmxdmmmdabnxxdmmnx'))
#输出:
['dm', 'dm', 'dm', 'dm']
13. findall+分组:优先匹配分组⾥的内容
f=re.findall('www\.(baidu|163)','www.baidu')
print(f)
#输出
['baidu']
14. 有名分组:?Ppattern 匹配⽅式 将⽤pattern在字符串⾥匹配到的内容以键值对的形式输出,name为key,pattern匹配到的结果为
value
import re
s='alex23xiaoming35xiaohong56'
print(re.search('(?P<name>[a-z]+)(?P<age>\d+)',s).groupdict('name'))
#输出
{'name': 'alex', 'age': '23'}
字符表
re模块下的⽅法:
1. re.findall(pattern, string) pattern是正则表达式,string 是需要匹配的字符串
返回所有符合条件的, 返回列表返回所有符合条件的, 返回列表
2. obj=re.search(pattern, string) 到⼀个即停⽌寻,返回⼀个对象,通过三种⽅法调⽤:
#实例:
import re
obj=re.search('a(..)x','scdcdabnxmn')
print(type(obj))
print(obj)
up())
ups())
updict())
#输出
<class 're.Match'>
<re.Match object; span=(5, 9), match='abnx'>
abnx
('bn',)
{}
3. re.match(pattern,string)从开头匹配,返回⼀个对象,调⽤同search
4. re.split(pattern,string) 按正则表达式搜索到的结果分割字符串,结果中不包含分隔符
import re
s='alexm23xiaoming35mxiaohongm56'
print(re.split('\d\w',s))
#输出
python正则表达式不包含['alexm', 'xiaoming', 'mxiaohongm', '']
5. re.sub(‘需要替换的对象’,‘替换的内容’,s,n替换次数):替换
import re
s='abchjh9vjhfe8kjqv3bj'
print(re.sub('\d+','A',s))
#输出:
abchjhAvjhfeAkjqvAbj
6. repile(pattern) 编译正则表达式
import re
s='abchjh933737vjhfe8kjqv3bj'
com=repile('\d+')
#两种使⽤⽅法
print(com.findall(s))
print(re.findall(com,s))
#输出
['933737', '8', '3']
['933737', '8', '3']
7. re.finditer() 返回迭代器,迭代对象是re.Match对象,调⽤⽅法如search和match
import re
s='abchjh933737vjhfe8kjqv3bj'
it=re.finditer('\d+',s)
print(type(it))
print(type(next(it)))
print(next(it).group())
#输出:
<class 'callable_iterator'>
<class 're.Match'>
8
8. findall+分组:优先匹配分组⾥的内容
f=re.findall('www\.(baidu|163)','www.baidu')
print(f)
#输出
['baidu']
9. 在分组加?:去优先级
import re
f=re.findall('www\.(?:baidu|163)','www.baidu')
print(f)
#输出
['www.baidu']
10. re.S: 匹配时⾃动换⾏
正则表达式中,“.”的作⽤是匹配除“\n”以外的任何字符,也就是说,它是在⼀⾏中进⾏匹配。这⾥的“⾏”是以“\n”进⾏区分的。a字符串有每⾏的末尾有⼀个“\n”,不过它不可见。
如果不使⽤re.S参数,则只在每⼀⾏内进⾏匹配,如果⼀⾏没有,就换下⼀⾏重新开始,不会跨⾏。⽽使⽤re.S参数以后,正则表达式会将这个字符串作为⼀个整体,将“\n”当做⼀个普通的字符加⼊到这个字符串中,在整体中进⾏匹配。
import re
a = '''asdfsafhellopass:
234455
worldafdsf
'''
b = re.findall('hello(.*?)world',a)
c = re.findall('hello(.*?)world',a,re.S)
print 'b is ' , b
print 'c is ' , c
#输出:
b is  []
c is  ['pass:\n\t234455\n\t']
#辨析:优先级/去优先级/贪婪匹配/⾮贪婪匹配
⼀些例⼦感受区别:
import re
print(re.findall('m(.*?)','ascxdcmmmmmdabnxamnx')) #优先匹配分组⾥的内容
['', '', '', '', '', '']
print(re.findall('m.+?','ascxdcmmmmmdabnxamnx')) #
['mm', 'mm', 'md', 'mn']
print(re.findall('m*?','ascxdcmmmmmdabnxamnx'))
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
print(re.findall('m(?:.*?)','ascxdcmmmmmdabnxamnx')) #去优先级
['m', 'm', 'm', 'm', 'm', 'm']
print(re.findall('m.*?','ascxdcmmmmmdabnxamnx'))
['m', 'm', 'm', 'm', 'm', 'm']
import re
print(re.findall('m(.*?)x','ascxdcmmmmmdabnxamnx')) #优先匹配分组⾥的内容,尽可能少的匹配
['mmmmdabn', 'n']
print(re.findall('m(.*)x','ascxdcmmmmmdabnxamnx')) #优先匹配分组⾥的内容,尽可能多的匹配
['mmmmdabnxamn']

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。