我有一个文本文件,其中包含俚语单词及其替代品的真实英语列表。我使用"将此文本文件转换为字典:"作为分裂点,在转换后打印字典时,一切似乎都没问题。
但是,来自此行的错误: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帖子后,我发现在某些情况下它是一个错误,但在这种情况下它似乎不是一个。
谢谢
答案 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)
(检查尾随单词边界)。