Python 正则表达式 - 只替换几个词

Python regex - Replace all but a few words

假设您有以下字符串:

"badger randomword badger mushroom mushroom somethingelse"

我想保留单词 "badger" 和 "mushroom",并用 "mushroom" 替换所有其他单词:

"badger mushroom badger mushroom mushroom mushroom"

但我找不到匹配 "everything except the words badger and mushroom" 的正则表达式。你能帮帮我吗?

这会起作用

(?!\bbadger\b|\bmushroom\b)\b[^\s]+\b

Regex Demo

Python代码

p = re.compile(r'(?!\bbadger\b|\bmushroom\b)\b[^\s]+\b')
test_str = "badger randomword badger mushroom mushroom somethingelse"
subst = "mushroom"
result = re.sub(p, subst, test_str)

Ideone Demo

您可以将 re.sub 与函数参数一起使用,这将使模式变得非常简单:

import re

s = "badger randomword badger mushroom mushroom somethingelse"
re.sub('\w+', lambda x: 'badger' if x.group(0) == 'badger' else 'mushroom', s)

一个非正则表达式的解决方案(并且更容易阅读)是这样的:

oldstring = "badger randomword badger mushroom mushroom somethingelse"
newstring = ""

for part in oldstring.split(" "):
    if part in ["badger", "mushroom"]:
        newstring += part
    else:
        newstring += "mushroom"
    newstring += " "

newstring = newstring[:-1]

执行此任务的一个简单的非正则表达式行将是 -

new_string = ' '.join(word if word == 'badger' else 'mushroom' for word in original_string.split())

我建议不要在这里使用复杂的正则表达式,因为 Beautiful Is Better Than Ugly in Python。

试试这个

(?!badger\b)\b\w+\b

Regex demo

解释:
(?!…):否定前瞻sample
\:转义特殊字符sample
\w: "word character": ASCII 字母、数字或下划线 sample
+:一个或多个 sample

Python

import re
p = re.compile(ur'(?!badger\b)\b\w+\b')
test_str = u"badger randomword badger mushroom mushroom somethingelse"
subst = u"mushroom"

result = re.sub(p, subst, test_str)#badger mushroom badger mushroom mushroom mushroom