1

对于一组典型的词后缀(ize、fy、ly、able...等),我想知道给定的词是否以它们中的任何一个结尾,然后删除它们。我知道这可以通过例如 word.endswith('ize') 迭代完成,但我相信有一种更简洁的正则表达式方法。尝试使用结束标记 $ 进行正面预测,但由于某种原因不起作用:

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

5 回答 5

6

鲜为人知的事实:endswith接受一组可能性:

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

不幸的是,它没有指出找到了哪个字符串,因此它对删除后缀没有帮助。

于 2013-02-23T13:42:48.190 回答
2

您正在寻找的实际上是 (?:)
看看这个:

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

看看这个网站正则表达式
有一些有用的正则表达式技巧。希望你喜欢它。

顺便说一句,python 库本身就是一个简洁而精彩的教程。
我帮助()很多:)

于 2013-02-23T13:22:22.410 回答
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'
于 2013-02-23T13:13:49.950 回答
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')]
于 2013-02-23T13:14:32.993 回答
0

如果是逐字匹配,那么只需删除前瞻检查,$插入符号就足够了。

于 2013-02-23T13:15:16.697 回答