Python 如何更改除两个字符以外的所有字符?
假设我们有一个字符串:Python 如何更改除两个字符以外的所有字符?,python,regex,python-3.x,regex-lookarounds,Python,Regex,Python 3.x,Regex Lookarounds,假设我们有一个字符串: 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 = "" f
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”
和“
以外的所有字符都替换为连字符(忽略大小写)。将字符放在前缀为^
符号的组中意味着这些字符将从匹配中忽略。您只需指定一组不希望匹配的字符:
>>> re.sub("[^io ]", "-", a, flags=re.I)
'I -o--- -i-- -o -o -o -i-----'
在这里,除
“i”
、“o”
和“
以外的所有字符都替换为连字符(忽略大小写)。将字符放在以^
符号为前缀的组中意味着这些字符将从匹配中忽略。查找范围为零长度。要使替换正确工作,需要在匹配负前瞻中的断言时匹配字符:
c = re.sub('(?!i|o).', a, flags = re.I)
此外,由于不必替换空白字符,您可以将
更改为\S
:
c = re.sub('(?!i|o)\\S', a, flags = re.I)
Lookarounds的长度为零。要使替换正确工作,需要在匹配负前瞻中的断言时匹配字符:
c = re.sub('(?!i|o).', a, flags = re.I)
此外,由于不必替换空白字符,您可以将
更改为\S
:
c = re.sub('(?!i|o)\\S', a, flags = re.I)
没问题
(?!…)
是负向前看的,因此re.sub(r'(?!i | o)',-',a)
将返回相同的字符串a
,但在不是紧跟在i
或o
前面的每个字母后插入连字符。没问题(?!…)
是负向前看的,因此re.sub(r'(?!i | o)',-',a)
将返回相同的字符串a
,但在不是紧跟在i
或o
前面的每个字母后插入连字符。左右看的长度为零。就这样。谢谢。环顾四周的长度为零。就这样。非常感谢。