假设我们有一个字符串:
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-.-"
我不知道为什么。显然,我不明白(?!...)
的工作原理。
答案 0 :(得分:5)
您只需指定一组您 想要匹配的字符:
>>> re.sub("[^io ]", "-", a, flags=re.I)
'I -o--- -i-- -o -o -o -i-----'
此处,除"i"
,"o"
和" "
之外的所有字符都替换为连字符(忽略大小写)。将字符放在以^
符号为前缀的组中意味着匹配中将省略这些字符。
答案 1 :(得分:1)
Lookarounds是零长度。为了使替换正常工作,您需要在负前瞻中的断言匹配时匹配字符:
c = re.sub('(?!i|o).', a, flags = re.I)
此外,由于不必替换空格字符,因此您可以将.
更改为\S
:
c = re.sub('(?!i|o)\\S', a, flags = re.I)