Python:当dict键中有','时,为什么re.sub不能用dict值替换dict键

时间:2013-12-25 03:30:49

标签: python regex dictionary

这里有点python /编程新手。首先,代码:

import re
patt_list = ['However,', 'phenomenal', 'brag']
dictionary = {'phenomenal': 'phenomenal|extraordinary|remarkable|incredible', 'However,': 'However,|Nevertheless,|Nonetheless,', 'brag': 'brag|boast'}

def replacer_factory1(dictionary):
    def replacing(match):
        if len(dictionary) > 0:
            word = match.group()
            exchange = dictionary.get(word, word)
            spintax = '{' + exchange + '}'
            create_place_holder = spintax.replace(' ', '#!#')
            return create_place_holder
        else:
            return ""
    return replacing

def replacing1(text):
    regex_patt_list = r'\b(?:' + '|'.join(patt_list) + r')\b'
    replacer = replacer_factory1(dictionary)
    return re.sub(regex_patt_list, replacer, text)

with open('test_sent.txt', 'r+') as sent:
    read_sent = sent.read()
    sent.seek(0)
    sent.write(replacing1(read_sent))

因此,我在此处创建的代码会在文本文件test_sent.txt中搜索名为patt_list的列表中的单词。如果单词在文本文件中,则re.sub用于将名为dictionary的字典中的键替换为该字典中的相应值,然后将这些更改写回文本文件。 (这段代码实际上是一个更大的脚本的一部分,其中字典的键是从patt_list创建的,以防万一你想知道为什么在这里需要patt_list

但是,我对此代码的问题是字典键However,没有替换为其对应的值However,|Nevertheless,|Nonetheless, - 而其余的键:值替换工作正常,并且被写入文本文件。

我认为However,中的逗号可能是导致此问题的逗号,因为我尝试了另一个键:键末尾带逗号的值,这也不起作用。

任何人都可以告诉我为什么会这样吗?

运行代码之前'test_sent.txt'的内容:

Quite phenomenal. However, nothing to brag about?

运行代码后的'test_sent.txt'的内容:

Quite {phenomenal|extraordinary|remarkable|incredible}. However, nothing to {brag|boast} about?

我真正希望输出看起来像:

Quite {phenomenal|extraordinary|remarkable|incredible}. {However,|Nevertheless,|Nonetheless,} nothing to {brag|boast} about bragg's vinegar?

我不想要的(bragg's上的部分匹配):

Quite {phenomenal|extraordinary|remarkable|incredible}. {However,|Nevertheless,|Nonetheless,} nothing to {brag|boast} about {brag|boast}g's vinegar?

编辑:为了回应下面“WKPLUS”提供的有用答案,从\b末尾删除regex_patt_list可以在这里工作,但不是为了更好用,我有这个代码。字典在现实中要大得多,所以当删除\b时,我会在文本中得到部分匹配,这是我不想要的。我更新了test_sent.txt,在最后添加了bragg's vinegar字样,以说明删除\b时的部分匹配问题。

2 个答案:

答案 0 :(得分:3)

删除regex_patt_list中的第二个“\ b”将解决您的问题。

def replacer_factory1(dictionary):
    def replacing(match):
        if len(dictionary) > 0:
            word = match.group()[:-1]
            exchange = dictionary.get(word, word)
            spintax = '{' + exchange + '}'
            create_place_holder = spintax.replace(' ', '#!#')
            return create_place_holder + match.group()[-1]
        else:
            return ""
    return replacing

def replacing1(text):
    regex_patt_list = r'\b(?:' + '|'.join(patt_list) + r')\W'
    replacer = replacer_factory1(dictionary)
    return re.sub(regex_patt_list, replacer, text)

解决问题的棘手办法。

答案 1 :(得分:1)

我想我看到了这个问题。逗号不被视为“单词字符”。因此,在字符串'但是'中,逗号实际上将被视为结束字边界,而不是它后面的空格。由于这种混淆,您通过使用单词边界快捷键“\ b”定义的正则表达式模式与该单词不匹配。

如果你用\ W(对于非单词字符)替换最后的\ b,它会以你想要的方式工作吗?