這是對問題的參考: Replaceholders with dictionary keys/values
我有占位符(與參考的問題相同,除了最后一個)。在那里我需要替換 placeholder $fil_TABLE_NAME1,其中$fil_保持不變但表名不同(用下劃線拆分,可以包含數字)
placeholders = {r'\$plc_hldr1': '1111',
r'\$plc_hldr2': 'abcd',
r'\$\d*date_placeholder': '20200101',
r'\$fil_\w ': '(select * from table)'
}
對于替換,我正在使用參考問題中的調整代碼
def remove_escape_chars(reggie):
return re.sub(r'\\\$\\d\*|\$\d*|\\\$fil\\\_\\\w\\\ |\\', '', reggie) #modification
def multiple_replace(escape_dict, text):
# Create a second dictionary to lookup regex match replacement targets
unescaped_placeholders = { remove_escape_chars(k): placeholders[k] for k in placeholders }
# Create a regular expression from all of the dictionary keys
regex = re.compile("|".join(escape_dict.keys()))
return regex.sub(lambda match: unescaped_placeholders[remove_escape_chars(match.group(0))], text)
但是當我執行它時
text = "sometext $fil_SAMPLE_TABLE_NAME some more text $plc_hldr2 some more more text
1234date_placeholder some text $5678date_placeholder"
result = multiple_replace(placeholders, text)
print(result)
我得到 sometext $fil_SAMPLE_TABLE_NAME some more text abcd some more more text 20200101 some text 20200101- $fil_SAMPLE_TABLE_NAME沒有被替換。
我認為我的正則運算式有一些問題,可能是一些錯誤的轉義,但經過幾次修改,我無法找到問題所在。
有人會幫我嗎?
uj5u.com熱心網友回復:
我會對此采取稍微不同的方法。與其嘗試匹配匹配部分字串的正則運算式,不如創建一個正則運算式,在其自己的組中包含每個單獨的正則運算式,然后使用匹配的組號查找替換值。對于您的示例資料,正則運算式如下所示:
(\$plc_hldr1)|(\$plc_hldr2)|(\$\d*date_placeholder)|(\$fil_\w )
然后python代碼將是:
placeholders = {r'\$plc_hldr1': '1111',
r'\$plc_hldr2': 'abcd',
r'\$\d*date_placeholder': '20200101',
r'\$fil_\w ': '(select * from table)'
}
replacements = list(placeholders.values())
text = "sometext $fil_SAMPLE_TABLE_NAME some more text $plc_hldr2 some more more text $1234date_placeholder some text $5678date_placeholder"
regex = re.compile('(' ')|('.join(placeholders.keys()) ')')
regex.sub(lambda m: replacements[m.lastindex-1], text)
輸出:
sometext (select * from table) some more text abcd some more more text 20200101 some text 20200101
請注意,這要求任何占位符正則運算式中的任何組都必須是非捕獲的,即(?:...)而不是(...).
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/458788.html
上一篇:正則運算式findall模式
