我希望能够使用re.sub从'foos, bars and bees'
生成'foo, bar and bee'
。
我甚至无法在所有单词中添加's'。一旦我得到那部分,我将努力排除'和'。我尝试用\b
对"s"
进行修改但是匹配单词的开头和结尾。如果我使用'\w*\b'
,则替换整个单词。我试图用Python文档来解决这个问题,并且(?P)
或(?<=...)
看起来后面的断言似乎可能就是我所追求的,但我无法让它们合作,并且示例是有限的。
答案 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
表示在单词字符和非单词字符之间匹配的单词边界。