我有带占位符的文本,如:
sometext $plc_hldr1 some more text $plc_hldr2 some more more text $1234date_placeholder some text $5678date_placeholder
然后我有字典,其中键表示占位符,值是占位符应替换为的值:
placeholders = {'$plc_hldr1': '1111',
'$plc_hldr2': 'abcd'}
我找到并调整了处理更换的功能:
def multiple_replace(adict, text):
# Create a regular expression from all of the dictionary keys
regex = re.compile("|".join(map(re.escape, adict.keys( ))))
# For each match, look up the corresponding value in the dictionary
return regex.sub(lambda match: adict[match.group(0)], text)
函数正在为$plc_hldr1
和$plc_hldr2
执行它的工作
但是有$1234date_placeholder
和$5678date_placeholder
两个值都应该用一个预定义值替换。在这种情况下date_placeholder
保持不变,但数字部分总是不同的
我想到的是:
def multiple_replace(adict, text):
# Create a regular expression from all of the dictionary keys
regex = re.compile("|".join(map(re.escape, adict.keys( ))))
regex = re.sub("\$\d*date_placeholder", "20200101", txt)
# For each match, look up the corresponding value in the dictionary
return regex.sub(lambda match: adict[match.group(0)], text)
但是有没有更优雅的方式呢?如果我有更多带有可变数字部分的占位符,这些占位符应替换为相同的值(例如$1234dname\U占位符,$1234age\U占位符)
如果不需要转义其余占位符,可以将
\$\d*date_placeholder
与其余占位符组合。然后,创建第二个没有任何特殊正则表达式字符的字典,用于查找要替换正则表达式匹配项的内容map(re.escape, adict.keys())
在上面的代码中是必需的,因为占位符名称中有特殊的正则字符$
。我建议您自己添加特殊字符转义,并将\$\d*date_placeholder
查找添加为placeholders
中的键/值对。这样就不需要在键上映射re.escape
,也不需要在multiple_replace
函数中使用第二个替换就像这样
这种方法的缺点是,如果在占位符中引入新模式,则必须更新
remove_escape_chars(...)
函数中的正则表达式。(它将扩展到类似的模式,例如$1234dname_placeholder
或$1234age_placeholder
。)相关问题 更多 >
编程相关推荐