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

时间:2014-11-29 17:58:34

标签: python regex python-3.x regex-lookarounds

假设我们有一个字符串:

a = "I would like to go to dinner."

很容易将字符串中的所有io更改为-&。如果我们定义:

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-.-"

我不知道为什么。显然,我不明白(?!...)的工作原理。

2 个答案:

答案 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)