python正则表达式后缀匹配

时间:2013-02-23 13:09:11

标签: python regex

对于一组典型的单词后缀(ize,fy,ly,able ...等),我想知道给定的单词是否以其中任何一个结尾,然后将其删除。我知道这可以用word.endswith('ize')迭代完成,但是我相信有一种更整洁的正则表达方式。尝试使用结束标记$的积极前瞻但是由于某种原因不起作用:

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

5 个答案:

答案 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)

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