正则表达式(python3-re模块示例)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式(python3-re模块示例)相关的知识,希望对你有一定的参考价值。
1.常用的正则表达式
‘.‘ 默认匹配除 之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行 ‘^‘ 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a"," abc eee",flags=re.MULTILINE) ‘$‘ 匹配字符结尾, 若指定flags MULTILINE ,re.search(‘foo.$‘,‘foo1 foo2 ‘,re.MULTILINE).group() 会匹配到foo1 ‘*‘ 匹配*号前的字符0次或多次, re.search(‘a*‘,‘aaaabac‘) 结果‘aaaa‘ ‘+‘ 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果[‘ab‘, ‘abb‘] ‘?‘ 匹配前一个字符1次或0次 ,re.search(‘b?‘,‘alex‘).group() 匹配b 0次 ‘{m}‘ 匹配前一个字符m次 ,re.search(‘b{3}‘,‘alexbbbs‘).group() 匹配到‘bbb‘ ‘{n,m}‘ 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果‘abb‘, ‘ab‘, ‘abb‘] ‘|‘ 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果‘ABC‘ ‘(...)‘ 分组匹配, re.search("(abc){2}a(123|45)", "abcabca456c").group() 结果为‘abcabca45‘ ‘A‘ 只从字符开头匹配,re.search("Aabc","alexabc") 是匹配不到的,相当于re.match(‘abc‘,"alexabc") 或^ ‘‘ 匹配字符结尾,同$ ‘d‘ 匹配数字0-9 ‘D‘ 匹配非数字 ‘w‘ 匹配[A-Za-z0-9] ‘W‘ 匹配非[A-Za-z0-9] ‘s‘ 匹配空白字符、 、 、 , re.search("s+","ab c1 3").group() 结果 ‘ ‘ ‘(?P<name>...)‘ 分组匹配
2.re模块
re.match(pattern, string[, flags]) 从头开始匹配
re.search(pattern, string[, flags]) 匹配包含
re.findall(pattern, string) 把所有匹配到的字符放到以列表中的元素返回
re.split(pattern, string[, maxsplit=0) 以匹配到的字符当做列表分隔符
re.sub(pattern, replace, string[, count=0] 匹配字符并替换
re.fullmatch 全部匹配
2.1 简单例子
>>> import re >>> s = ‘abc1d3e‘re.match
>>> print(re.match(‘[0-9]‘, s)) None >>> re.match(‘[0-9]‘, ‘1bdfd‘) <_sre.SRE_Match object; span=(0, 1), match=‘1‘>re.search
>>> re.search(‘[0-9]‘, s) <_sre.SRE_Match object; span=(3, 4), match=‘1‘>>>> re.search(‘[0-9]‘, s).group()
‘1‘# span是类似于切片的索引re.findall
>>> re.findall(‘[0-9]‘, s) [‘1‘, ‘3‘]re.split
>>> re.split(‘d‘, s) [‘abc1‘, ‘3e‘]>>> s2 = ‘alex99jack88rain77jinxin50‘ >>> re.split(‘d+‘, s2) [‘alex‘, ‘jack‘, ‘rain‘, ‘jinxin‘, ‘‘]re.findall
>>> s1 = ‘aabbaa123‘ >>> re.findall(‘a‘, s1) [‘a‘, ‘a‘, ‘a‘, ‘a‘]>>> re.findall(‘d+‘, s2)
[‘99‘, ‘88‘, ‘77‘, ‘50‘]re.sub
>>> re.sub(‘a‘, ‘c‘, s1) ‘ccbbcc123‘
3.其他正则表达式
分组匹配
>>> import re >>> s=‘alex123‘ >>> re.search(‘([a-z]+)([0-9]+)‘, s).group() (‘alex123‘) >>> re.search(‘([a-z]+)([0-9]+)‘, s).groups() (‘alex‘, ‘123‘)
>>> re.search(‘d‘, s) <_sre.SRE_Match object; span=(4, 5), match=‘1‘> >>> re.search(‘d+‘, s) <_sre.SRE_Match object; span=(4, 7), match=‘123‘>
>>> re.search(‘D+‘, s) <_sre.SRE_Match object; span=(0, 4), match=‘alex‘>
另外一种分组匹配
>>> s1 = ‘130704200005250613‘ >>> re.search(‘(?P<province>d{3})(?P<city>d{3})(?P<born_year>d{4})‘, s1).groupdict() {‘province‘: ‘130‘, ‘city‘: ‘704‘, ‘born_year‘: ‘2000‘}
复杂一点的re.sub
>>> re.sub(‘d+‘,‘_‘, s3) ‘alex_jack_rain_\jinxin_|mac-oldboy‘ >>> re.sub(‘d+‘,‘_‘, s3, count=2) ‘alex_jack_rain77\jinxin50|mac-oldboy‘
re.split
>>> s2 = ‘alex99jack88rain77jinxin50#mac-oldboy‘ >>> re.split(‘d+|#|-‘, s2) [‘alex‘, ‘jack‘, ‘rain‘, ‘jinxin‘, ‘‘, ‘mac‘, ‘oldboy‘] >>> s4 = ‘9-2*5/3+73*99/4*2998+10*568/14‘ >>> re.split(‘[-*/+]‘, s4) [‘9‘, ‘2‘, ‘5‘, ‘3‘, ‘7x03‘, ‘99‘, ‘4‘, ‘2998‘, ‘10‘, ‘568‘, ‘14‘] >>> re.split(‘[-*/+]‘, s4, maxsplit=2) [‘9‘, ‘2‘, ‘5/3+7x03*99/4*2998+10*568/14‘]
re.fullmatch
>>> re.fullmatch(‘alex123‘, ‘alex123‘) <_sre.SRE_Match object; span=(0, 7), match=‘alex123‘> >>> re.fullmatch(‘[email protected]w+.(com|cn|edu)‘, ‘[email protected]‘) <_sre.SRE_Match object; span=(0, 18), match=‘[email protected]‘>
re.compile(pattern[,flags])根据包含正则表达式的字符串创建模式对象
>>> pattern = re.compile(‘[email protected]w+.(com|cn|edu)‘) # 如果需要多次的匹配,建议首先把pattern用compile方法转化,这样解释器就不需要每次都转化了。 >>> pattern.fullmatch(‘[email protected]‘) <_sre.SRE_Match object; span=(0, 17), match=‘[email protected]‘>
4.Flags标志符
- re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
- M(MULTILINE): 多行模式,改变‘^‘和‘$‘的行为
- S(DOTALL): 改变‘.‘的行为,make the ‘.‘ special character match any character at all, including a newline; without this flag, ‘.‘ will match anything except a newline.
- X(re.VERBOSE) 可以给你的表达式写注释,使其更可读,下面这2个意思一样
a = re.compile(r"""d + # the integral part . # the decimal point d * # some fractional digits""", re.X) b = re.compile(r"d+.d*")
其他的例子
>>> re.search(‘a‘, "Alex", re.I) <_sre.SRE_Match object; span=(0, 1), match=‘A‘> >>> re.search(‘foo.$‘, ‘foo1 foo2 ‘) <_sre.SRE_Match object; span=(5, 9), match=‘foo2‘> >>> re.search(‘foo.$‘, ‘foo1 foo2 ‘, re.M) <_sre.SRE_Match object; span=(0, 4), match=‘foo1‘> >>> print(re.search(‘.‘, ‘ ‘)) None >>> re.search(‘.‘, ‘ ‘, re.S) <_sre.SRE_Match object; span=(0, 1), match=‘ ‘> >>> print(re.search(‘. #test‘, ‘alex‘)) None >>> re.search(‘. #test‘, ‘alex‘, re.X) <_sre.SRE_Match object; span=(0, 1), match=‘a‘>
以上是关于正则表达式(python3-re模块示例)的主要内容,如果未能解决你的问题,请参考以下文章