对于一组典型的单词后缀(ize,fy,ly,able ...等),我想知道给定的单词是否以其中任何一个结尾,然后将其删除。我知道这可以用word.endswith('ize')迭代完成,但是我相信有一种更整洁的正则表达方式。尝试使用结束标记$的积极前瞻但是由于某种原因不起作用:
pat='(?=ate|ize|ify|able)$'
word='terrorize'
re.findall(pat,word)
答案 0 :(得分:5)
鲜为人知的事实:endswith
接受了一系列可能性:
if word.endswith(('ate','ize','ify','able')):
#...
不幸的是,它并不表示找到了哪个字符串,因此删除后缀无效。
答案 1 :(得分:2)
你要找的是(?:)
看看这个:
re.sub(r"(?:ate|ize|ify|able)$", "", "terrorize")
查看此网站Regex 有一些有用的正则表达式技巧。希望你喜欢它。
BTW,python库本身就是一个整洁的& amp;精彩的教程 我帮忙()很多:)答案 2 :(得分:1)
前瞻是一种锚模式,就像^
和$
锚定与特定位置匹配,但本身不是匹配。
您希望匹配这些后缀,但在单词的末尾,请改为使用word-edge anchor \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'
答案 3 :(得分:1)
您需要调整括号,只需更改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')]
答案 4 :(得分:0)
如果是逐字匹配,那么只需删除前瞻检查, $ 插入就足够了。