Python正则表达式为字符串中的所有单词添加一个字符,除了和

时间:2014-08-30 00:16:22

标签: python regex

我希望能够使用re.sub从'foos, bars and bees'生成'foo, bar and bee'

我甚至无法在所有单词中添加's'。一旦我得到那部分,我将努力排除'和'。我尝试用\b"s"进行修改但是匹配单词的开头和结尾。如果我使用'\w*\b',则替换整个单词。我试图用Python文档来解决这个问题,并且(?P)(?<=...)看起来后面的断言似乎可能就是我所追求的,但我无法让它们合作,并且示例是有限的。

3 个答案:

答案 0 :(得分:4)

这是有效的,基于替换接受可调用的:

re.sub('(\w+)', lambda m: m.group(1) + 's' if m.group(1) != 'and' else 'and', 'foo, bar and bee')

它的灵感来自an old bug report(倒数第二)。

编辑:更短且可能更易读的解决方案:

re.sub('(and)|(\w+)', lambda m: m.group(1) or m.group(2) + 's', 'foo, bar and bee')

它还有一个好处,就是可以更容易地将其他单词添加到例外列表中,就像评论中提出的isedev一样。

答案 1 :(得分:2)

不考虑要排除的字词,以下内容将添加“&#39;到字符串中所有单词的结尾:

re.sub('([a-zA-Z]+)','\\1s','foo, bar and bee')
-> 'foos, bars ands bees'

要以更通用且不易出错的方式复数单词,您可能需要查看inflect包(至少为英语)。

答案 2 :(得分:2)

以下代码会将s添加到除and之外的所有字词,

>>> import re
>>> s = "foo, bar and bee "
>>> m = re.sub(r'(?!and)(\b\w+\b)', r'\1s', s)
>>> m
'foos, bars and bees '

否定前瞻断言它会匹配一个或多个单词字符,但不匹配\band\b。这里\b表示在单词字符和非单词字符之间匹配的单词边界。