Python模块-re模块

re正则匹配,如果没有匹配到就返回None,匹配结果加上.group()就会以字符串形式返回匹配结果

  • re的匹配语法

re.match()     从头开始匹配

>>> re.match('ab','abcdefg')
<_sre.SRE_Match object; span=(0, 2), match='ab'>
>>> re.match('ab','cabdefg')

只能从左边第一个开始匹配

re.search()    匹配包含

>>> re.search('ab','abcdefg')
<_sre.SRE_Match object; span=(0, 2), match='ab'>
>>> re.search('ab','cabdefg')
<_sre.SRE_Match object; span=(1, 3), match='ab'>

从字符串中的任意位置开始匹配

re.match()和re.search()方法只能匹配一次,如果要匹配全部的结果,可以使用re.findall()

re.findall()   把所有匹配到的字符放入列表中

>>> re.findall('ab','abcdefabcdefab')
['ab', 'ab', 'ab']

re.split()     以匹配到的字符当做列表分隔符,来把元素分开

>>> re.split('\+','ab+c+d+ef+gh')
['ab', 'c', 'd', 'ef', 'gh']

因为“+”为匹配规则,所以需要用转义符把“+”转义为普通的“+”

re.sub()       匹配字符并替换

>>> re.sub('\.','5','org.cn.net.com.gov')
'org5cn5net5com5gov'
>>> re.sub('\.','5','org.cn.net.com.gov',count=2)
'org5cn5net.com.gov'

count为替换的次数

re.fullmatch()    匹配全部

>>> re.fullmatch('python','python')
<_sre.SRE_Match object; span=(0, 6), match='python'>

要整个字符串完全匹配

re.compile(pattern, flags=0)  匹配规则

>>> test = re.compile('[TH]+',flags=re.I)
>>> test.search('python').group()
'th'
  • re常用的表达式规则

'.'     默认匹配除\n之外的任意一个字符

>>> re.match('.','python')
<_sre.SRE_Match object; span=(0, 1), match='p'>
>>> re.match('.','java')
<_sre.SRE_Match object; span=(0, 1), match='j'>
>>> re.findall('.','ja\nva')
['j', 'a', 'v', 'a']

'^'和'\A'     从字符串开头开始匹配

>>> re.match('p','python')
<_sre.SRE_Match object; span=(0, 1), match='p'>
>>> re.search('^p','python')
<_sre.SRE_Match object; span=(0, 1), match='p'>
>>> re.search('\Ap','python')
<_sre.SRE_Match object; span=(0, 1), match='p'>

以上三种匹配都是只从左边第一个开始匹配

'$'和'\Z'      从字符串结尾开始匹配

>>> re.search('on$','python')
<_sre.SRE_Match object; span=(4, 6), match='on'>
>>> re.search('on\Z','python')
<_sre.SRE_Match object; span=(4, 6), match='on'>

'*'     匹配*号前的字符0次或多次

>>> re.search('ab*','abbbcabbcd')
<_sre.SRE_Match object; span=(0, 4), match='abbb'>
>>> re.search('(ab)*','ababababcabbcd')
<_sre.SRE_Match object; span=(0, 8), match='abababab'>
>>> re.search('f*','ababababcabbcd')
<_sre.SRE_Match object; span=(0, 0), match=''>

f没有匹配到,返回了空,而不是None

'+'     匹配前一个字符1次或多次

>>> re.search('ab+','abbbcabbcd')
<_sre.SRE_Match object; span=(0, 4), match='abbb'>
>>> re.search('(ab)+','ababababcabbcd')
<_sre.SRE_Match object; span=(0, 8), match='abababab'>
>>> re.search('f+','ababababcabbcd')

f没有匹配到,所以返回None

'?'     匹配前一个字符1次或0次

>>> re.search('ab?','abbbbc')
<_sre.SRE_Match object; span=(0, 2), match='ab'>
>>> re.search('d?','abbbbc')
<_sre.SRE_Match object; span=(0, 0), match=''>

'[...]'   匹配[]中的字符,[0-9]为数字,[a-z]为全部小写字母,[A-Z]为全部大写字母,[A-Za-z0-9]为全部大小写字母和数字

>>> re.findall('[pto]','python')
['p', 't', 'o']
>>> re.findall('[a-z]','python')
['p', 'y', 't', 'h', 'o', 'n']
>>> re.findall('[A-Z]','PyThoN')
['P', 'T', 'N']
>>> re.findall('[0-9]','sch01ar')
['0', '1']
>>> re.findall('[A-Za-z0-9]','PyTh0n!@#')
['P', 'y', 'T', 'h', '0', 'n']

'[^...]'  匹配不在[]中的字符

>>> re.findall('[^pto]','python')
['y', 'h', 'n']
>>> re.findall('[^A-Z]','PyThoN')
['y', 'h', 'o']
>>> re.findall('[^a-z]','PyThoN')
['P', 'T', 'N']
>>> re.findall('[^0-9]','sch01ar')
['s', 'c', 'h', 'a', 'r']
>>> re.findall('[^a-zA-Z0-9]','sch01ar')
[]

'{m}'   匹配前一个字符m次

>>> re.search('[0-9]{3}','12345')
<_sre.SRE_Match object; span=(0, 3), match='123'>

匹配数字3次

'{n,m}' 匹配前一个字符n到m次

>>> re.findall('[0-9]{2,4}','abc1abcd12ab123abcde1234abcdef12345abc')
['12', '123', '1234', '1234']

匹配2到4位的0-9的数字

'|'     匹配|左或|右的字符

>>> re.findall('h|n','pythonandphp')
['h', 'n', 'n', 'h']
>>> re.findall('h|b','pythonandphp')
['h', 'h']
>>> re.findall('b|h','pythonandphp')
['h', 'h']
>>> re.search("abc|ABC","ABCBabcCD").group()
'ABC'

|右边优先于左边

'(...)'  分组匹配

>>> re.search("(abc){2}a(123|45)", "abcabca456c").group()
'abcabca45'
>>> re.search("(abc){2}a(123|45)", "abcabca456c").groups()
('abc', '45')

groups()返回为元组

'(?P<name>...)'   分组匹配

>>> re.search("(?P<year>[0-9]{4})(?P<month>[0-9]{2})(?P<day>[0-9]{2})",'19930519').groupdict()
{'year': '1993', 'day': '19', 'month': '05'}

groupdict()以字典形式返回

'\d'    匹配数字0-9

>>> re.findall("\d", "abc123abc456abc")
['1', '2', '3', '4', '5', '6']
>>> re.findall("\d+", "abc123abc456abc")
['123', '456']

'\D'    匹配非数字

>>> re.findall("\D+", "abc123abc456abc")
['abc', 'abc', 'abc']

'\w'    匹配[A-Za-z0-9]

>>> re.findall("\w+", "ab-c12*3abc#456")
['ab', 'c12', '3abc', '456']

'\W'    匹配非[A-Za-z0-9],也可以匹配空白字符、\t、\n、\r

>>> re.findall("\W+", "ab-c12*3abc#456")
['-', '*', '#']

'\s'     匹配空白字符、\t、\n、\r

>>> re.findall("\s+", "ab bc \ndef\twed\r123")
[' ', ' \n', '\t', '\r']

'\S'   匹配非空白字符、\t、\n、\r

>>> re.findall("\S+", "ab bc \ndef\twed\r123")
['ab', 'bc', 'def', 'wed', '123']
  • Flags标志位

flags标志位,用于控制正则表达式的匹配方式

括号内是完整写法

I(IGNORECASE): 忽略大小写

>>> re.findall("[a-z]", "Sch01aR",re.I)
['S', 'c', 'h', 'a', 'R']
>>> re.findall("[a-z]", "Sch01aR",re.IGNORECASE)
['S', 'c', 'h', 'a', 'R']

M(MULTILINE): 多行模式,改变'^'和'$'匹配开头结尾的行为

>>> re.search('[ef]+','abc\nefg\nhij',flags=re.M).group()
'ef'
>>> re.search('[ef]+','abc\nefg\nhij',flags=re.MULTILINE).group()
'ef'

S(DOTALL): 改变'.'的行为,也能匹配\n

>>> re.search('.+','abc\nefg\nhij',flags=re.S).group()
'abc\nefg\nhij'
>>> re.search('.+','abc\nefg\nhij',flags=re.DOTALL).group()
'abc\nefg\nhij'

X(VERBOSE): 给匹配规则加上注释

>>> re.search('[0-9]+ #匹配一个或多个0-9的数字','abc123cde456fgh',re.X).group()
'123'
>>> re.search('[0-9]+ #匹配一个或多个0-9的数字','abc123cde456fgh',re.VERBOSE).group()
'123'

 

posted @ 2018-02-12 22:49  Sch01aR#  阅读(265)  评论(0编辑  收藏  举报