对于一组典型的词后缀(ize、fy、ly、able...等),我想知道给定的词是否以它们中的任何一个结尾,然后删除它们。我知道这可以通过例如 word.endswith('ize') 迭代完成,但我相信有一种更简洁的正则表达式方法。尝试使用结束标记 $ 进行正面预测,但由于某种原因不起作用:
pat='(?=ate|ize|ify|able)$'
word='terrorize'
re.findall(pat,word)
鲜为人知的事实:endswith
接受一组可能性:
if word.endswith(('ate','ize','ify','able')):
#...
不幸的是,它没有指出找到了哪个字符串,因此它对删除后缀没有帮助。
您正在寻找的实际上是 (?:)
看看这个:
re.sub(r"(?:ate|ize|ify|able)$", "", "terrorize")
看看这个网站正则表达式。
有一些有用的正则表达式技巧。希望你喜欢它。
顺便说一句,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'
您需要调整括号,只需更改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')]
如果是逐字匹配,那么只需删除前瞻检查,$插入符号就足够了。