2017-09-03 36 views
-1

我想使用Python簽約的話,但現在面臨的錯誤來代替。在擴大英語收縮的基礎上,最常見的收縮的字典

import re 
tweet = "I luv my <3 iphone & you're awsm apple. DisplayIsAwesome, sooo happppppy http://www.apple.com" 
contractions_dict = {"ain't": "am not", 
        "aren't": "are not", 
        "can't": "cannot", 
        "you're": "you are"}  

contractions_re = re.compile('(%s)' '|'.join(contractions_dict.keys())) 

def expand_contractions(s, contractions_dict=contractions_dict): 
    def replace(match): 
     return contractions_dict[match.group(0)] 

    return contractions_re.sub(replace, s) 

expand_contractions(tweet) 

我試過在「你是」中添加「/」,無濟於事。

的輸出是通過通過原來的鳴叫。我哪裏錯了?

謝謝

回答

1

這裏有一個線索:

>>> print('(%s)' '|'.join(contractions_dict.keys())) 
you're(%s)|aren't(%s)|ain't(%s)|can't 

由於%s有一個正則表達式沒有特別的意義,它只會匹配本身。但是輸入中沒有百分號,所以匹配失敗。

我懷疑你正在尋找類似

>>> print('|'.join('(%s)' % k for k in contractions_dict.keys())) 
(you're)|(aren't)|(ain't)|(can't) 

或許

>>> print('(%s)' % '|'.join(contractions_dict.keys())) 
(you're|aren't|ain't|can't) 

但因爲你正在使用match.group(0)(即整個匹配的字符串)的捕獲是不相關的,並且有沒有必要在交替中加入單詞。所以更簡單的解決方案是好的:

>>> contractions_re = re.compile('|'.join(contractions_dict.keys())) 
>>> expand_contractions(tweet) 
'I luv my <3 iphone & you are awsm apple. DisplayIsAwesome, sooo happppppy \xf0\x9f\x99\x82 http://www.apple.com' 
+0

很愚蠢的錯誤,是吧? :) 謝謝! –