正则表达式(python3-re模块示例)

1.常用的正则表达式

'.'     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
'^'     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$'     匹配字符结尾, 若指定flags MULTILINE ,re.search('foo.$','foo1\nfoo2\n',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") 或^
'\Z'    匹配字符结尾,同$ 
'\d'    匹配数字0-9
'\D'    匹配非数字
'\w'    匹配[A-Za-z0-9]
'\W'    匹配非[A-Za-z0-9]
's'     匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
'(?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+7\3*99/4*2998+10*568/14'
>>> re.split('[-\*/+]', s4)
['9', '2', '5', '3', '7\x03', '99', '4', '2998', '10', '568', '14']
>>> re.split('[-\*/+]', s4, maxsplit=2)
['9', '2', '5/3+7\x03*99/4*2998+10*568/14']

re.fullmatch

>>> re.fullmatch('alex123', 'alex123')
<_sre.SRE_Match object; span=(0, 7), match='alex123'>
>>> re.fullmatch('\w+@\w+\.(com|cn|edu)', '[email protected]')
<_sre.SRE_Match object; span=(0, 18), match='[email protected]'>

re.compile(pattern[,flags])根据包含正则表达式的字符串创建模式对象

>>> pattern = re.compile('\w+@\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\nfoo2\n')
<_sre.SRE_Match object; span=(5, 9), match='foo2'>
>>> re.search('foo.$', 'foo1\nfoo2\n', re.M)
<_sre.SRE_Match object; span=(0, 4), match='foo1'>

>>> print(re.search('.', '\n'))
None
>>> re.search('.', '\n', re.S)
<_sre.SRE_Match object; span=(0, 1), match='\n'>

>>> print(re.search('.  #test', 'alex'))
None
>>> re.search('.   #test', 'alex', re.X)
<_sre.SRE_Match object; span=(0, 1), match='a'>

猜你喜欢

转载自www.cnblogs.com/haoqirui/p/9969730.html