1. 程式人生 > >正則表示式(python3-re模組示例)

正則表示式(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('\[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\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'>