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)