假设我们有一个字符串:
a = "I would like to go to dinner."
很容易将字符串中的所有i和o更改为-。如果我们定义:
b = re.sub("i|o","-", a, flags = re.I)
我们得到:
b = "- w-uld l-ke t- g- t- d-nner."
但是我不知道怎么得到:
"I -o--- -i-- -o -o -o -i-----"
以优雅的方式使用 RE 模块(注意 b 中的最后一个 - 是通过替换点获得的)。一个人可以写
c = ""
for char in a:
c += char if char.lower() in "io" else "-"
但我想用 RE 来做到这一点。我试着写类似的东西
c = re.sub('(?!i|o)', a, flags = re.I)
但这会导致
"I- -wo-u-l-d- -li-k-e- -to- -go- -to- -di-n-n-e-r-.-"
我也不知道为什么。显然,我不明白 (?!...) 是如何工作的。
请您参考如下方法:
您只需要指定一组您不想匹配的字符:
>>> re.sub("[^io ]", "-", a, flags=re.I)
'I -o--- -i-- -o -o -o -i-----'
这里,除了"i"、"o" 和"" 之外的所有字符都被替换为连字符(忽略大小写)。将字符放在以 ^ 符号为前缀的组中意味着这些字符将从匹配中省略。
