2013-02-23 184 views
0

對於一個典型的一組詞後綴(ize,fy,ly,able ......等),我想知道給定的單詞是否以它們中的任何一個結尾,然後將它們刪除。我知道這可以用word.endswith('ize')來迭代地完成,但我相信有一個更好的正則表達方式。嘗試使用結束標記$進行正面預測,但由於某種原因無法正常工作:python正則表達式後綴匹配

pat='(?=ate|ize|ify|able)$' 
word='terrorize' 
re.findall(pat,word) 

回答

2

你要找的實際上是(:)
檢查了這一點:

re.sub(r"(?:ate|ize|ify|able)$", "", "terrorize") 

看一看這個網站Regex
有一些有用的正則表達式技能。希望你喜歡它。

順便說一句,python庫本身是一個整潔的&奇妙的教程。
我的幫助()有很多:)

1

先行是一個錨紋,就像^$錨匹配到一個特定的位置,但本身不匹配。

來匹配這些後綴,但在詞的結尾,所以用這個詞邊緣錨\b代替:

r'(ate|ize|ify|able)\b' 

然後用re.sub(),以取代那些:

re.sub(r'(ate|ize|ify|able)\b', '', word) 

其中工作得很好:

>>> word='terrorize' 
>>> re.sub(r'(ate|ize|ify|able)\b', '', word) 
'terror' 
1

你需要調整parenthese,只是改變從pat

(?=ate|ize|ify|able)$ 

到:

(?=(ate|ize|ify|able)$) 

如果需要在稍後刪除了後綴,您可以使用模式:

^(.*)(?=(ate|ize|ify|able)$) 

測試在REPL:

>>> pat = '^(.*)(?=(ate|ize|ify|able)$)' 
>>> word = 'terrorize' 
>>> re.findall(pat, word) 
[('terror', 'ize')] 
0

如果是逐字匹配,那麼只需刪除前瞻檢查,插入符號就足夠了。

3

鮮爲人知的事實:endswith接受的可能性元組:

if word.endswith(('ate','ize','ify','able')): 
    #... 

不幸的是,它並不表示該字符串被發現,所以它不」幫助刪除後綴。

+0

+1新信息 – hmghaly 2013-02-23 14:53:26