错误:无需在位置重复

时间:2017-09-04 12:17:17

标签: python regex debugging dictionary

我有一个文本文件,其中包含俚语单词及其替代品的真实英语列表。我使用"将此文本文件转换为字典:"作为分裂点,在转换后打印字典时,一切似乎都没问题。

但是,来自此行的错误:import javax.inject.Inject import database.MyPostgresDriver import play.api.db.slick.{DatabaseConfigProvider, HasDatabaseConfigProvider} import database.MyPostgresDriver.api._ 表示slangs_re = re.compile('|'.join(slang_dict.keys()))

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

nothing to repeat at position 112207

这是带有字典的代码(抱歉,但是文本文件太大而无法包含。示例可用here)。预期的输出是"健身"但实际输出是一个错误:

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)

在阅读其他SO帖子后,我发现在某些情况下它是一个错误,但在这种情况下它似乎不是一个。

谢谢

1 个答案:

答案 0 :(得分:2)

我建议更换

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)(检查尾随单词边界)。