如何更改除两个之外的所有字符?

Ant*_*ine 1 python regex python-3.x regex-lookarounds

我们假设我们有一个字符串:

a = "I would like to go to dinner."
Run Code Online (Sandbox Code Playgroud)

很容易将字符串中的所有内容i和内容更改o-.如果我们定义:

b = re.sub("i|o","-", a, flags = re.I)
Run Code Online (Sandbox Code Playgroud)

我们得到:

b = "- w-uld l-ke t- g- t- d-nner."
Run Code Online (Sandbox Code Playgroud)

但我不知道如何得到:

"I -o--- -i-- -o -o -o -i-----"
Run Code Online (Sandbox Code Playgroud)

在使用RE模块优雅的方式(注意,最后-b通过替换点获得).有人可以写

c = ""
for char in a:
    c += char if char.lower() in "io" else "-"
Run Code Online (Sandbox Code Playgroud)

但是我想用RE来做这件事.我试着写一些类似的东西

c =  re.sub('(?!i|o)', a, flags = re.I)
Run Code Online (Sandbox Code Playgroud)

但结果是

"I- -wo-u-l-d- -li-k-e- -to- -go- -to- -di-n-n-e-r-.-"
Run Code Online (Sandbox Code Playgroud)

而且我不知道为什么.显然,我不明白是如何(?!...)运作的.

Ale*_*ley 5

你只需要指定一组字符,你希望匹配:

>>> re.sub("[^io ]", "-", a, flags=re.I)
'I -o--- -i-- -o -o -o -i-----'
Run Code Online (Sandbox Code Playgroud)

这里,除了对所有字符"i","o"" "用连字符(忽略大小写)代替.将字符放在以^符号为前缀的组中意味着将从匹配中省略这些字符.