Python實用技法第24篇:正則:查詢和替換文字

Mark發表於2019-02-16

上一篇文章: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篇:正則:以不區分大小寫的方式對文字做查詢和替換

相關文章