Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于计算文字字符的Python正则表达式替代函数_Python_Regex - Fatal编程技术网

用于计算文字字符的Python正则表达式替代函数

用于计算文字字符的Python正则表达式替代函数,python,regex,Python,Regex,我正在开发一个应用程序,需要在其中搜索和替换文本体中的字符串 我遇到并一直在使用第三个答案作为我函数的基础 我的代码如下所示: 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

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

我遇到并一直在使用第三个答案作为我函数的基础

我的代码如下所示:

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
    )
但是,这会被诸如
“勇敢的资源管理器”
之类的文本绊倒,该文本会因
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
    )
它允许对周期进行逐字计算,但保持dict键的完整性(而不是使用“INT[.]”作为将失败的键

然而,这有一种难闻的味道,当然,这只考虑了时期,而不是任何其他特殊的字符


因此,我想我的问题是,是否有更好的方法可以按照字面意思对任何特殊字符进行运算和求值。

更干净的方法是在加入字符串之前,先对实际字符串进行转义,如下所示

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'

哦,谢谢,这看起来确实更好。我仍然面临的一个问题是尾随空格。例如,“INT.EPID资源管理器”将被替换为“INT.EPID资源管理器”不会。请删除
\b
并尝试一下,如果您确实需要
\b
断言,那么我认为您需要添加括号。我对Python不太了解;但在我所知道的所有正则表达式中,
是一个低优先级运算符,因此上面的表达式将等效于
(?:\bINT。)|…
。您可能想要
\b(?:Int.|…)\b
。如果您做了此更改,那么您可能无法只编写
r'\b(?:'+…
,因为
\b(:
不是有效的正则表达式;您可能必须编写
r'\b'+(:'+'.'''..加入(subs_dict.keys())。替换('.,[]]))+'))+r'\b'
。当然,也要按照Fourtheye的建议进行更改。