2017-09-04 90 views
0

我有一个文本文件,其中包含一个真正的英文俚语单词和他们的替代品列表。我将这个文本文件转换成一个使用“:”作为分割点的字典,并且在转换后打印字典时,一切似乎都没问题。错误:没有重复的位置

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

在尝试调试时,我发现错误以某种方式链接到字典。这是因为当我在下面运行代码时,我没有得到正确的输出,但是我也没有得到一个错误。该代码的预期输出是“适应性”,但实际输出是“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)。预期的输出是“健身”,但实际的输出是一个错误:

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线程,我才知道,这是在某些情况下的错误,但它似乎并没有成为一个在这个案例。

谢谢

+0

如果'slang_dict.keys()'包含正则表达式元字符('*','+'等),它们需要被转义。 – Tushar

+0

最有可能的是,你可以用'r'(?<!\ w){}(?!\ w)“来修复它。format('|'.join([re.escape(x)for slang_dict.keys ()]))'。或者,如果所有单词都由字母,数字和'_'组成,您甚至可以使用'\ w +'模式并在尝试获取值之前检查密钥是否存在于字典中。 –

+0

此外,'contractions_re'应该替换为'slangs_re'。见https://ideone.com/VVR3ke –

回答

2

我建议用

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

更换

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

,并确保您通过长按降序排序的键。

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

+0

感谢!它导致了奇怪的错误。当我给一个输入_luv 3 iphone awsm display awesome,soo happy_我希望输出是_love 3 phone真棒显示真棒,soo happy_。然而,这是输出:335电话真棒displayWhy awesomeohame,isohoh hatehappy_。我检查过字典中的问题,但没有。这可能是什么原因?为什么真棒变得真棒? –

+0

@MythicCocoa结果模式是什么?你可以通过http://pastebin.com分享吗? –

+0

你使用过吗?(?<!\ w){}(?!\ w)'?它看起来好像你省略了整个单词检查。 –