基于正则表达式模式的词干不起作用(Python)

时间:2015-09-06 11:19:30

标签: python regex

我想编写一个函数来使用正则表达式替换字符串。但是,这并不是必要的。不确定是什么问题。

我在Windows 10上使用Python 3.4.3。

这是来自nltk代码簿的代码。

import re

replacement_patterns = [
    (r'won\'t', 'will not'),
    (r'can\'t', 'cannot'),
    (r'i\'m', 'i am'),
    (r'ain\'t', 'is not'),
    (r'(\w+)\'ll', '\g<1> will'),
    (r'(\w+)n\'t', '\g<1> not'),
    (r'(\w+)\'ve', '\g<1> have'),
    (r'(\w+)\'s', '\g<1> is'),
    (r'(\w+)\'re', '\g<1> are'),
    (r'(\w+)\'d', '\g<1> would')
]

class RegexpReplacer(object):
    def __init__(self, patterns=replacement_patterns):
        self.patterns = [(re.compile(regex), repl) for (regex, repl) in patterns]
        print("init")
        print(self.patterns)

    def replace(self, text):
        print("In replace")
        s = text
        print(self.patterns)
        for (pattern, repl) in self.patterns:
            s = re.sub(pattern, repl, s)
            print(s)
            return s


if __name__ == "__main__":
    print("RegEx replacers")
    replacer = RegexpReplacer()
    result = replacer.replace("can't is a contraction")
    print(result)
    result = replacer.replace("I should've done that thing I didn't do")
    print(result)

2 个答案:

答案 0 :(得分:2)

indent problem函数中有replace

class RegexpReplacer(object):

    def replace(self, text):
        print("In replace")
        s = text
        print(self.patterns)
        for (pattern, repl) in self.patterns:
            s = re.sub(pattern, repl, s)
            print(s)
        return s  #here is the problem

关于你的功能的一点建议,删除print行以使其更干净和样本。

class RegexpReplacer(object):

    def replace(self, text):
        for (pattern, repl) in self.patterns:
            text = re.sub(pattern, repl, text)
        return s

答案 1 :(得分:1)

除了已接受的答案之外,您的代码还有一个问题:在原始字符串中使用excape序列。例如

r'won\'t'

是一个原始字符串(r前缀),不会扩展转义序列,所以你的字符串实际上是

won\'t

改为使用混合引号:

r"won't"

此错误现在没有咬你,因为\'没有特殊含义,因此会转换为',但会在其他时间转换,例如

r'\\'

是一个长度为2的字符串。