上一篇文章:Python實用技法第23篇:正則:文字模式的匹配和查詢
下一篇文章:Python實用技法第25篇:正則:以不區分大小寫的方式對文字做查詢和替換
1、需求?
我們想對字串中的文字做查詢和替換。
2、解決方案?
對於簡單的文字模式,使用str.replace()即可。
例如:
text=`mark ,帥哥,18,183 帥,mark`
print(text.replace(`18`,`19`))
print(text)
執行結果:
mark ,帥哥,19,193 帥,mark
mark ,帥哥,18,183 帥,mark
針對更為複雜的模式,可以使用re模組中的sub()函式。
例項:將日期格式從“11/28/2018”改為“2018-11-28”
import re
text=`今天是:11/28/2018`
print(re.sub(r`(d+)/(d+)/(d+)`,r`3-1-2`,text))
print(text)
結果:
今天是:2018-11-28
今天是:11/28/2018
sub()的第一個引數是要匹配的模式,第二個引數是要替換的模式。類似的“3”這樣的反斜線加數字表示模式中捕獲組的編號。
如果打算用相同的模式執行重複替換,可以考慮先將模式編譯以獲得更好的效能。
例項:
import re
text=`今天是:11/28/2018`
datepat=re.compile(r`(d+)/(d+)/(d+)`)
print(datepat.sub(r`3-1-2`,text))
print(text)
結果:
今天是:2018-11-28
今天是:11/28/2018
對於更加複雜的情況,可以指定一個替換回撥函式。
示例:
import re
from calendar import month_abbr
text=`今天是:11/28/2018`
datepat=re.compile(r`(d+)/(d+)/(d+)`)
def change_date(m):
mon_name=month_abbr[int(m.group(1))]
return `{} {} {}`.format(m.group(3),mon_name,m.group(2))
print(datepat.sub(change_date,text))
print(text)
結果:
今天是:2018 Nov 28
今天是:11/28/2018
替換回撥函式的輸入引數是一個匹配物件,由match()和find()返回。用.group()方法來提取匹配中特定的部分。該函式返回替換後的文字。
除了得到替換後的文字外,如果還想知道一共完成了多少次替換,可以使用re.subn()。
示例:
import re
text=`今天是:11/28/2018,昨天是11/27/2018`
datepat=re.compile(r`(d+)/(d+)/(d+)`)
new_text,n=datepat.subn(r`3-1-2`,text)
print(text)
print(new_text)
print(n)
結果:
今天是:11/28/2018,昨天是11/27/2018
今天是:2018-11-28,昨天是2018-11-27
2
3、分析?
除了以上展示的sub()呼叫之外,關於表示式的查詢和替換並沒有什麼更多可說的了,最有技巧性的地方就是指定的正規表示式。。
上一篇文章:Python實用技法第23篇:正則:文字模式的匹配和查詢
下一篇文章:Python實用技法第25篇:正則:以不區分大小寫的方式對文字做查詢和替換