对于一个典型的一组词后缀(ize,fy,ly,able ......等),我想知道给定的单词是否以它们中的任何一个结尾,然后将它们删除。我知道这可以用word.endswith('ize')来迭代地完成,但我相信有一个更好的正则表达方式。尝试使用结束标记$进行正面预测,但由于某种原因无法正常工作:python正则表达式后缀匹配
pat='(?=ate|ize|ify|able)$'
word='terrorize'
re.findall(pat,word)
对于一个典型的一组词后缀(ize,fy,ly,able ......等),我想知道给定的单词是否以它们中的任何一个结尾,然后将它们删除。我知道这可以用word.endswith('ize')来迭代地完成,但我相信有一个更好的正则表达方式。尝试使用结束标记$进行正面预测,但由于某种原因无法正常工作:python正则表达式后缀匹配
pat='(?=ate|ize|ify|able)$'
word='terrorize'
re.findall(pat,word)
你要找的实际上是(:)
检查了这一点:
re.sub(r"(?:ate|ize|ify|able)$", "", "terrorize")
看一看这个网站Regex。
有一些有用的正则表达式技能。希望你喜欢它。
顺便说一句,python库本身是一个整洁的&奇妙的教程。
我的帮助()有很多:)
先行是一个锚纹,就像^
和$
锚匹配到一个特定的位置,但本身不匹配。
您想来匹配这些后缀,但在词的结尾,所以用这个词边缘锚\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'
你需要调整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')]
如果是逐字匹配,那么只需删除前瞻检查,插入符号就足够了。
鲜为人知的事实:endswith
接受的可能性元组:
if word.endswith(('ate','ize','ify','able')):
#...
不幸的是,它并不表示该字符串被发现,所以它不”帮助删除后缀。
+1新信息 – hmghaly 2013-02-23 14:53:26