Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何更改除两个字符以外的所有字符?_Python_Regex_Python 3.x_Regex Lookarounds - Fatal编程技术网

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
前面的每个字母后插入连字符。左右看的长度为零。就这样。谢谢。环顾四周的长度为零。就这样。非常感谢。