1. 程式人生 > >python正則表示式基本實現

python正則表示式基本實現

1、首先要匯入python的re模組。

2、元字元 . ^ $ * + ? {} [] \ | ()

re模組中的findall(str1,str2)方法返回字串str2中匹配str1格式的字串。例如在字串'dit dot det,dct dit dot'中匹配'dit'結果為:

?
1 2 str1 = 'dit dot det,dct dit dot' print re.findall('dit',str1)

結果:

?
1 ['dit', 'dit']

|作用:'dit|dct'表示dit或者dct。

?
1 2 str1
= 'dit dot det,dct dit dot' print re.findall('dit|dct',str1)

結果:

?
1 ['dit', 'dct', 'dit']

[]作用:[ic]表示i或c,例如'd[ic]t'表示dit和dct兩者,和'dit|dct'等價:

?
1 2 str1 = 'dit dot det,dct dit dot' print re.findall('d[ic]t',str1)

結果:

?
1 ['dit', 'dct', 'dit']

^作用一:[^ic]中^表示否定,即除了i和c:

?
1 2 str1 = 'dit dot det,dct dit dot' print re.findall('d[^ic]t',str1)

結果:

?
1 ['dot', 'det', 'dot']

^作用二:^dit表示子串dit在開頭位置,而dct不是在開頭:

?
1 2 3 str1 = 'dit dot det,dct dit dot' print re.findall('^dit',str1) print re.findall('^dct',str1)

結果:

?
1 ['dit'][]

$作用:dot$表示子串dot要在末尾位置,而dct不是在末尾:

?
1 2 3 str1 = 'dit dot det,dct dit dot' print re.findall('dot$',str1) print re.findall('dct$',str1)

結果:

?
1 ['dot'][]

.作用:d.t表示d與t之間省略了一個任意字元:

?
1 2 str1 = 'dit dot det,dct dit dot' print re.findall('d.t',str1)

結果:

?
1 ['dit', 'dot', 'det', 'dct', 'dit', 'dot']

+作用:di+t表示d與t之間省略了一個或多個'i':

?
1 2 str1 = 'd dt dit diit det' print re.findall('d.+t',str1)

結果:

?
1 ['dit', 'diit']

*作用:di*t表示d與t之間省略了零個至多個'i':

?
1 2 str1 = 'd dt dit diit det' print re.findall('d.*t',str1)

結果:

?
1 ['dt', 'dit', 'diit']

經常,'.'和'+'或者'*'搭配使用。'.+'表示省略了一個至多個任意元素,'.*'表示省略了零個至多個任意元素:

?
1 2 3 str1 = 'd dt dit diit det' print re.findall('d.+t',str1) print re.findall('d.*t',str1)

結果:

?
1 ['d dt dit diit det']['d dt dit diit det']

?作用一:看.+的匹配結果,'dit'、'dot'也滿足'd.+t'的匹配條件,而輸出的卻是滿足匹配條件的最長子串'dit dot det,dct dit dot',這個叫貪婪匹配。如果要輸出最短的匹配字串,只需在'+'後面加上'?':(注:對於'*'也是一樣,只需在'*'後面加上'?')

?
1 2 str1 = 'd dt dit diit det' print re.findall('d.+?t',str1)

結果:

?
1 ['dit', 'dot', 'det', 'dct', 'dit', 'dot']

?作用二:di?t表示i可有可無,即dt、dit都滿足匹配條件:

?
1 2 str1 = 'd dt dit diit det' print re.findall('di?t',str1)

結果:

?
1 ['dt', 'dit']

{}作用一:di{n}t表示d和t之間有n個'i':

?
1 2 str1 = 'dt dit diit diiit diiiit' print re.findall('di{2}t',str1)

結果:

?
1 ['diit']

{}作用二:di{n,m}t表示d和t之間有n到m個'i':

?
1 2 str1 = 'dt dit diit diiit diiiit' print re.findall('di{1,3}t',str1)

結果:

?
1 ['dit', 'diit', 'diiit']

其中,n和m都是可以省略的。{n,}表示n個到任意個;{,m}表示0個到m個;{,}表示任意個,和'*'功能一樣:

?
1 2 3 4 str1 = 'dt dit diit diiit diiiit' print re.findall('di{1,}t',str1) print re.findall('di{,3}t',str1) print re.findall('di{,}t',str1)

結果:

?
1 2 3 ['dit', 'diit', 'diiit', 'diiiit'] ['dt', 'dit', 'diit', 'diiit'] ['dt', 'dit', 'diit', 'diiit', 'diiiit']

\作用一:取消元字元,變成轉義字元:

?
1 2 3 str1 = '^abc ^abc' print re.findall('^abc',str1) print re.findall('\^abc',str1)

結果:

?
1 []['^abc', '^abc']

\作用二:預定義字元

?
1 2 3 str1 = '12 abc 345 efgh' print re.findall('\d+',str1) print re.findall('\w+',str1)

結果:

?
1 2 ['12', '345'] ['12', 'abc', '345', 'efgh']

()作用:在匹配字串後,只輸出匹配字串'()'裡面的內容:

?
1 2 3 4 str1 = '12abcd34' print re.findall('12abcd34',str1) print re.findall('1(2a)bcd34',str1) print re.findall('1(2a)bc(d3)4',str1)

結果:

?
1 2 3 ['12abcd34'] ['2a'] [('2a', 'd3')]

3、re模組裡的主要方法:findall()、finditer()、match()、search()、compile()、split()、sub()、subn()。

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

作用:在string中從左往右搜尋與pattern匹配的字串,結果以list形式返回。

?
1 2 str1 = 'ab cd' print re.findall('\w+',str1)

結果:['ab', 'cd']

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

作用:其功能與re.findall相同,但結果以迭代器的形式返回。

?
1 2 3 4 str1 = 'ab cd' iter1 = re.finditer('\w+',str1) for a in iter1: print a.group(),a.span()

結果:

ab (0, 2)
      cd (3, 5)

(注:a.group()返回滿足匹配調節的字串,a.span()返回字串的起始位置和末尾位置)

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

作用:在string中從左往右搜尋與pattern匹配的字串,無匹配結果則返回None,否則返回一個search例項。

?
1 2 3 4 5 6 str1 = 'ab cd' result = re.search('cd',str1) if result == None: print 'None' else: print result.group(),result.start(),result.end()

結果:cd 3 5

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

作用:判斷string的頭部是否與pattern匹配,是則返回match例項,否則返回None。

?
1 2 3 4 5 6 str1 = 'ab cd' result = re.match('cd',str1) if result == None: print 'None' else: print result.group(),result.start(),result.end()

結果:None

re.compile(pattern,flags = 0)

作用:對匹配格式pattern進行編譯,返回一個例項物件。對正則表示式先編譯,可以大幅提高匹配速度。

?
1 2 3 str1 = 'ab cd' pre = re.compile('ab') print pre.findall(str1)

結果:['ab']

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

作用:在string匹配pattern的時候做分割:

?
1 2 3 4 str1 = 'ab.c.de' str2 = '12+34-56*78/90' print re.split('\.',str1) print re.split('[\+\-\*/]',str2)

結果:

['ab', 'c', 'de']
      ['12', '34', '56', '78', '90']

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

作用:在string當中把滿足pattern正則的字串替換成repl:

?
1 2 str1 = 'abcde' print re.sub('bc','123',str1)

結果:a123de

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

作用:其功能與re.sub()相同,但返回的結果多了一個數字,代表替換了多少次

?
1 2 str1 = 'abcdebce' print re.subn('bc','123',str1)

結果:('a123de123e', 2)