如何修改与Python中特定正则表达式匹配的文本?

我需要在句子中标记负面语境。 算法如下:

  • 检测一个否定器(不/从不/不/不/等)
  • 检测结束标点符号的句子(。;:!?)
  • 将_NEG添加到这之间的所有单词。
  • 现在,我已经定义了一个正则表达式来挑选所有这些事件:

    def replacenegation(text):
        match=re.search(r"((b(never|no|nothing|nowhere|noone|none|not|havent|hasnt|hadnt|cant|couldnt|shouldnt|wont|wouldnt|dont|doesnt|didnt|isnt|arent|aint)b)|bw+n'tb)((?![.:;!?]).)*[.:;!?b]", text)
        if match:
            s=match.group()
            print s
            news=""
            wlist=re.split(r"[.:;!? ]" , s)
            wlist=wlist[1:]
            print wlist
            for w in wlist:
                if w:
                    news=news+" "+w+"_NEG"
            print news
    

    我可以检测并替换匹配的组。 但是,我不知道如何在此操作后重新创建完整的句子。 同样对于多个匹配,match.groups()给我错误的输出。

    例如,如果我的输入句子是:

    I don't like you at all; I should not let you know my happiest secret.
    

    输出应该是:

    I don't like_NEG you_NEG at_NEG all_NEG ; I should not let_NEG you_NEG know_NEG my_NEG happiest_NEG secret_NEG .
    

    我该怎么做呢?


    首先,您最好将负面预读(?![.:;!?]).)*改为否定字符类。

    ([^.:;!?]*)
    

    然后,你需要使用无捕获组和删除多余的人你的否定词,因为你已经通过3捕获组包围它,它就会回报3匹配您的否定词好像not 。 那么你可以使用re.findall()来查找所有匹配项:

    >>> regex =re.compile(r"((?:never|no|nothing|nowhere|noone|none|not|havent|hasnt|hadnt|cant|couldnt|shouldnt|wont|wouldnt|dont|doesnt|didnt|isnt|arent|aint)b|bw+n'tb)([^.:;!?]*)([.:;!?b])")
    >>> 
    >>> regex.findall(s)
    [("don't", ' like you at all', ';'), ('not', ' let you know my happiest secret', '.')]
    

    或者为了替换你可以使用带有lambda函数的re.sub作为替代者的话:

    >>> regex.sub(lambda x:x.group(1)+' '+' '.join([i+'_NEG' for i in x.group(2).split()])+x.group(3) ,s)
    "I don't like_NEG you_NEG at_NEG all_NEG; I should not let_NEG you_NEG know_NEG my_NEG happiest_NEG secret_NEG."
    

    请注意,为了捕捉标点符号,您还需要将其输入到捕获组。 然后,可以在编辑后的re.sub()中将句子添加到句子的末尾。

    链接地址: http://www.djcxy.com/p/89527.html

    上一篇: How to modify text that matches a particular regular expression in Python?

    下一篇: How to create a generic timeout object for various code blocks?