错误: 在位置上没有要重复的内容

2024-10-03 11:15:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文本文件,里面有一个真正的英语俚语及其替代词的列表。我用“:”作为拆分点,将此文本文件转换为字典,在转换后打印词典时,一切似乎都正常。在

但是,来自这一行的错误:slangs_re = re.compile('|'.join(slang_dict.keys()))表示nothing to repeat at position 112207。在

在尝试调试时,我发现错误与字典有某种联系。这是因为当我运行下面的代码时,我没有得到正确的输出,但是我也没有得到错误。此代码的预期输出为“fitness”,但实际输出为“fitess”。在

import re

test = "fitess"

slang_dict = {"fitess":"fitness", "damm":"damn"}

slangs_re = re.compile('|'.join(slang_dict.keys()))

def correct_slang(s, slang_dict=slang_dict):
    def replace(match):
        return slang_dict[match.group(0)]

    return slangs_re.sub(replace, s)

test = correct_slang(test)
print(test)

这是字典中的代码(抱歉,文本文件太大,无法包含在内。示例可用here)。预期输出为“适合度”,但实际输出为错误:

^{pr2}$

在阅读了其他的SO线程后,我发现在某些情况下这是一个bug,但在本例中似乎不是。在

谢谢你


Tags: 代码testre字典def错误keysdict
1条回答
网友
1楼 · 发布于 2024-10-03 11:15:25

我建议更换

slangs_re = re.compile('|'.join(slang_dict.keys()))

^{pr2}$

并确保按长度按降序排列的键传递。在

from collections import OrderedDict
import re

test = "fitess no kome*"

slang_dict = {"Aha aha":"no", "fitess":"fitness", "damm":"damn", "kome*":"come", "ow wow":"rrf"}
slang_dict = OrderedDict(sorted(slang_dict.iteritems(), key=lambda x: len(x[0]), reverse=True))

slangs_re = re.compile(r"(?<!\w)(?:{})(?!\w)".format('|'.join([re.escape(x) for x in slang_dict])))
def correct_slang(s, slang_dict=slang_dict):
    def replace(match):
        return slang_dict[match.group(0)]

    return slangs_re.sub(replace, s)

test = correct_slang(test)
print(test)

参见Python demo

这将检查单词作为整个单词,并将转义每个搜索短语中的特殊字符,以便在将它们传递给正则表达式引擎时不会出现任何问题。在

如果您对整词匹配不感兴趣,请删除(?<!\w)(检查前导词边界)和{}(检查尾随词边界)。在

相关问题 更多 >