天天看點

14、re子產品

re子產品

正規表達式就是字元串的比對規則,在多數程式設計語言裡都有相應的支援,python裡對應的子產品是re

常用的表達式規則

'.'     預設比對除\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>...)' 分組比對 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 結果{'province': '3714', 'city': '81', 'birthday': '1993'}
           

re的比對文法有以下幾種

  • re.match 從頭開始比對
  • re.search 比對包含
  • re.findall 把所有比對到的字元放到以清單中的元素傳回
  • re.split 以比對到的字元當做清單分隔符
  • re.sub 比對字元并替換
  • re.fullmatch 全部比對

re.complie(pattern, flags=0)

Compile a regular expression pattern into a regular expression object, which can be used for matching using its match(), search() and other methods, described below.

The sequence

prog = re.compile(pattern)
result = prog.match(string)
           

is equivalent to

result = re.match(pattern, string)
           

but using e.complie() and saving the resulting regular expression object for reuse is more efficient when the expression will be used several times in a single program.

re.match(pattern, string, flags=0)

從起始位置開始根據模型去字元串中比對指定内容,比對單個

  • pattern 正規表達式
  • string 要比對的字元串
  • flags 标志位,用于控制正規表達式的比對方式
import re
obj = re.match('\d+', '123uuasf')
if obj:
    print obj.group()
           

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(pattern, string, flags=0)

根據模型去字元串中比對指定内容,比對單個

import re
obj = re.search('\d+', 'u123uu888asf')
if obj:
    print obj.group()
           

re.findall(pattern, string, flags=0)

match and search均用于比對單值,即:隻能比對字元串中的一個,如果想要比對到字元串中所有符合條件的元素,則需要使用 findall。

import re
obj = re.findall('\d+', 'fa123uu888asf')
print obj
           

re.sub(pattern, repl, string, count=0, flags=0)

用于替換比對的字元串

>>>re.sub('[a-z]+','sb','武配齊是abc123',)

>>> re.sub('\d+','|', 'alex22wupeiqi33oldboy55',count=2)
'alex|wupeiqi|oldboy55'
           

相比于str.replace功能更加強大

re.split(pattern, string, maxsplit=0, flags=0)

>>>s='9-2*5/3+7/3*99/4*2998+10*568/14'
>>>re.split('[\*\-\/\+]',s)
['9', '2', '5', '3', '7', '3', '99', '4', '2998', '10', '568', '14']

>>> re.split('[\*\-\/\+]',s,3)
['9', '2', '5', '3+7/3*99/4*2998+10*568/14']
           

re.fullmatch(pattern, string, flags=0)

整個字元串比對成功就傳回re object, 否則傳回None

re.fullmatch('\[email protected]\w+\.(com|cn|edu)',"[email protected]")
           

繼續閱讀