Skip to main content
 首页 » 编程设计

用于评估文字字符的 Python 正则表达式替换函数

2024年10月24日35myhome

我正在开发一个应用程序,我需要在其中搜索和替换文本正文中的字符串。

我遇到了 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'