字符串的搜索與替換
-
匹配或搜索特定模式的文本
- 字符串方法
str.find(substr) 主要為查找字符串中是否出現指定模式的文本,出現,返回首個出現的位置索引,不出現,返回-1
- 字符串方法
#實例
str1="21-year-old raises half-million for polar journey for"
print(str1.find("for"))
- 較復雜時,通常使用正則表達式
re.match() 從字符串開始去匹配,匹配到返回對象,需要取出已匹配到的文本,用group()方法
re.findall() 返回匹配到的文本列表
re.finditer() 返回匹配到的文本迭代對象
re.compile() 將模式字符串預編譯成模式對象,可重復使用,一次編譯,多次使用,對于用同一模式匹配多個字符串的情形,非常適用,一定程度上優化了性能。
#實例
import re
str1="21-year-old raises half-million for polar journey for 32"
result= re.match(r"\w*\d+\w*",str1)
allresult=re.findall(r"\w*\d+\w*",str1)
iterresult=re.finditer(r"\w*\d+\w*",str1)
if result:
print(result.group()) #結果為21,僅匹配
首個出現文本,并返回對象
print(allresult)#結果為['21','32']
for i in iterresult:
print(i.group())
上述模式多次被重復使用,可使用compile一次編譯,多次使用
#上述情形可修改為一次編譯,多次利用:
str1 = "21-year-old raises half-million for polar journey for 32"
pattern=re.compile(r"\w*\d+\w*")
result=pattern.match(str1)
allresult=pattern.findall(str1)
iterresult=pattern.finditer(str1)
if result:
print(result.group())
print(allresult)
for i in iterresult:
print(i.group())
-
字符串替換
- 簡單使用,字符串方法
str.replace()
- 簡單使用,字符串方法
text = 'yeah, but no, but yeah, but no, but yeah'
newtext=text.replace('yeah',"new")
print(newtext)
- 復雜使用,正則表達式
re.sub() 根據正式表達式模式,匹配并替換
import re
text1 = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
newtext1=re.sub(r"(\d+)/(\d+)/(\d+)",r"\3-\1-\2",text1)
print(newtext1)#結果:Today is 2012-11-27. PyCon starts 2013-3-13.
上述例子涉及到正則表達式中的捕獲分組和非捕獲分組的概念
捕獲組:()表示一個字表達式,捕獲出符合括號內的內容,可以通過從左到右計算組編號,從而可以引用組的編號來引用前面匹配到的文本
非捕獲組:以 (?) 開頭的組是純的非捕獲 組,它不捕獲文本 ,也不針對組合計進行計數。
常見的幾種非捕獲組:匹配表達式X,但是不包含表達式的文本
(?=X ) 僅當子表達式 X 在此位置的右側時才繼續匹配,例如,/w+(?=/d) 與后跟數字的單詞匹配,而不與該數字匹配。換言之,限制
了右側為X時才進行匹配
(?!X ) 僅當子表達式 X 不在 此位置的右側匹配時才繼續匹配。例如,例如,/w+(?!/d) 與后不跟數字的單詞匹配,而不與該數字匹配
換言之,限制了右側不為X時才進行匹配 。
(?<=X ) 僅當子表達式 X 在 此位置的左側匹配時才繼續匹配。例如,(?<=19)99 與跟在 19 后面的 99 的實例匹配。換言之,限制了左側為X時才進行匹配
(?<!X ) 僅當子表達式 X 不在此位置的左側匹配時才繼續匹配。例如,(?<!19)99 與不跟在 19 后面的 99 的實例匹配。換言之,限制了左側不為X時才進行匹配