2015-09-06 55 views
0

我想編寫一個函數來使用正則表達式替換字符串。但是,它並沒有做必要的事情。不知道什麼是錯的。正則表達式基於模式的詞幹行不通(Python)

我使用Python 3.4.3在Windows 10

這是從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

你在你的replace功能有indent problem

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 
+0

你好爍爍的字符串,縮進是問題。我只是爲了調試目的而放置印刷品。錯過縮進問題。謝謝.. !!,Bonson – Bonson

1

除了被接受的答案之外,還有一個額外的代碼問題:在原始字符串中使用排序序列。例如

r'won\'t' 

是一個原始字符串(R前綴)將不會擴大轉義序列,所以你的字符串實際上是

won\'t 

混合使用引號代替代替:

r"won't" 

由於\'沒有特別的含義,所以它會被轉換爲',但它會在某個其他時間,例如

r'\\' 

是lenght 2

+0

謝謝托馬斯..我已經在代碼中進行了更改。還有一個問題,我需要(r「..?或者我應該刪除它並使用(」不會「,」不會「)。 – Bonson

+1

不,你不需要它(r-弦本身什麼都沒有用正則表達式來處理),但是更多的compilicated正則表達式往往會有很多的excapes:'x \ dx'(x - some digit - x)。在這些情況下,使用原始字符串更容易,不用擔心' \ d'在字符串級別或正則表達式級別進行解釋。 –