2013-02-23 476 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