我有一个文本文件,其中包含a语单词列表及其真实英语替代词。我使用“:”作为分割点将此文本文件转换为字典,在转换后打印字典后,一切似乎都还不错。

但是,源自此行的错误: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提供了一个示例)。预期的输出为“ fitness”,但实际输出为错误:

import re

test = "fitess"

file = open("slang_conversion.txt","r")

slang_dict = {}

for line in file:
    x = line.split(":")
    a = x[0]
    b = x[1]
    c = len(b) - 1

    b = b[0:c]

    slang_dict[a] = b

slangs_re = re.compile('|'.join(slang_dict.keys())) # <-- error

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)


通过阅读其他SO线程,我知道在某些情况下这是一个错误,但在这种情况下似乎并不是一个错误。

谢谢

最佳答案

我建议更换

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




slangs_re = re.compile(r"(?<!\w)(?:{})(?!\w)".format('|'.join([re.escape(x) for x in slang_dict])))


并确保您按长度递减的顺序传递键。

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)(检查前导单词边界)和(?!\w)(检查后缀单词边界)。

关于python - 错误:该位置无可重复,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46036882/

10-11 01:03
查看更多