我正在开发一个应用程序,我需要在其中搜索和替换文本正文中的字符串。
我遇到了 this SO post并一直使用第三个答案作为我的功能的基础。
我的代码如下:
subs_dict = {
"INT.": "Internet",
...
}
def substitutions(self, text):
return re.sub(
r'\b' + '|'.join(subs_dict.keys())
+ r'\b', lambda m: subs_dict[m.group(0)],
text
)
但是,这会被诸如 "The INTREPID explorer" 之类的文本绊倒。失败并显示 Key Error对于 INTR .
问题是在比较“INT”。被解释为“INT”和任何其他字符,因为句点是特殊的。
我已经使用修改后的代码暂时解决了这个问题:
def substitutions(text):
return re.sub(
r'\b' + '|'.join(subs_dict.keys()).replace('.', [.])
+ r'\b', lambda m: subs_dict[m.group(0)],
text
)
这允许按字面计算句点但保持字典键的完整性(而不是使用“INT[.]”作为会失败的键。
但是,这有一种难闻的味道,当然只处理句点,而不处理任何其他特殊字符。
所以,我想我的问题是,是否有更好的方法可以按字面意义工作和评估任何特殊字符。
请您参考如下方法:
更简洁的方法是转义实际的字符串,使用 re.escape在加入他们之前,像这样
r'\b' + '|'.join(map(re.escape, subs_dict)) + r'\b'
例如,
>>> import re
>>> subs_dict = {"INT.": "Internet"}
>>> def substitutions(text):
... return re.sub(r'\b' + '|'.join(map(re.escape, subs_dict)) + r'\b',
... lambda m: subs_dict[m.group(0)], text)
...
>>> substitutions("The INTREPID explorer")
'The INTREPID explorer'
>>> substitutions("The INT.EPID explorer")
'The InternetEPID explorer'
