【发布时间】:2018-02-12 16:21:46
【问题描述】:
我有一个文本文件,其中包含俚语列表及其在真实英语中的替代词。我使用“:”作为分割点将此文本文件转换为字典,并且在转换后打印字典时一切似乎都很好。
但是,来自此行的错误: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 线程后,我知道在某些情况下这是一个错误,但在这种情况下似乎不是。
谢谢
【问题讨论】:
-
如果
slang_dict.keys()包含正则表达式元字符(*、+等),则需要对其进行转义。 -
很可能,您可以使用
r"(?<!\w){}(?!\w)".format('|'.join([re.escape(x) for x in slang_dict.keys()]))修复它。或者,如果所有单词都由字母、数字和_组成,您甚至可以使用\w+模式并在尝试获取值之前检查该键是否存在于字典中。 -
此外,
contractions_re应替换为slangs_re。见ideone.com/VVR3ke
标签: python regex debugging dictionary