最近因為一些原因頻繁使用正則表達式,因為以前系統整理過關于正則表達式的相關知識,所以這里僅記錄使用期間遇到的問題。
本文內容基于re
包
1. match和search方法的區別
??在Python中,re.search
和re.match
都是用于匹配字符串的正則表達式函數,但二者在匹配模式上有明顯的區別。具體如下:
re.match
: 該函數只在字符串的開始位置進行匹配。如果開頭不匹配,就不會繼續匹配下去。其作用類似于從字符串的開位置起尋找能找到符合正則表達式模式的子串。re.search
: 該函數會在整個字符串中搜索,直到找到一個匹配的子字符串。其作用類似于從完整的字符串中找到與正則表達式完整匹配的子串。
代碼舉例如下:
import re
rule=r'(ab|cd).*(ef|gh)' #以ab或cd開頭,以ef或gh結尾的字符串
str1='abef'
str2="dcabefabef"
str3="abxyefabstefsc"
print(re.match(rule,str1))
print(re.match(rule,str2))
print(re.match(rule,str3))
print(re.search(rule,str1))
print(re.search(rule,str2))
print(re.search(rule,str3))
其代碼執行結果如下:
<re.Match object; span=(0, 4), match='abef'>
None
<re.Match object; span=(0, 12), match='abxyefabstef'>
<re.Match object; span=(0, 4), match='abef'>
<re.Match object; span=(2, 10), match='abefabef'>
<re.Match object; span=(0, 12), match='abxyefabstef'>
從執行結果中可以發現,這兩個方法的返回類型是一樣的。
另外,使用^
和$
可以驗證完整的字符串是否符合正則表達式規定的模式。具體舉例如下:
rule=r'^(ab|cd).*(ef|gh)$' #以ab或cd開頭,以ef或gh結尾的字符串
str1='abef'
str2="dcabefabef"
print(re.match(rule,str1))
print(re.match(rule,str2))
print(re.search(rule,str1))
print(re.search(rule,str2))
其執行結果如下:
<re.Match object; span=(0, 4), match='abef'>
None
<re.Match object; span=(0, 4), match='abef'>
None
2. 利用正則表達式實現某些字符必須出現某些字符不能出現的效果
??組合使用零寬斷言可以實現利用利用正則表達式實現某些字符必須出現某些字符不能出現的效果。具體舉例如下:
rule=r'^(?=.*(ab|cd))(?!.*xy).*$' #ab或cd必須出現,且不能包含xy
str1="132ab23re"
str2="sefeabsefewxyseid"
str3="xyseqeqab"print(re.match(rule,str1))
print(re.match(rule,str2))
print(re.match(rule,str3))
其結果如下:
<re.Match object; span=(0, 9), match='132ab23re'>
None
None
但是在使用這種方式的時候要注意一點(ab|cd)
的后面不要添加.*
, 這個需要放到xy
的前面,否則實現不了同樣的效果,展示如下:
import rerule=r'^(?=.*(ab|cd).*)(?!xy)$'
str1="132ab23re"
str2="sefeabsefewxyseid"
str3="xyseqeqab"print(re.match(rule,str1))
print(re.match(rule,str2))
print(re.match(rule,str3))
其執行結果如下:
None
None
None
從結果中我們可以看到,str1和str2是符合要求但結果并沒有匹配上。
另外,在這種情況下^
和$
的使用也需要注意,如果不添加這兩種斷言,結果可能也是錯誤的。展示如下:
import rerule=r'(?=.*(ab|cd))(?!.*xy)'
str1="132ab23re"
str2="sefeabsefewxyseid"
str3="xyseqeqab"print(re.match(rule,str1))
print(re.match(rule,str2))
print(re.match(rule,str3))
其結果如下:
<re.Match object; span=(0, 0), match=''>
None
None