Python中re.sub()过滤反斜杠时为什么需要三个反斜杠\\\\\\?

一个字符串 string_a 中可能有反斜杠 \ 这个字符,用 re.sub()过滤掉它,为什么要打三个反斜杠 \\\ 才行呢? 这个 \ 到底谁在转义谁呀

re.sub('[\\\]', 'repl', string_a)

Python中re.sub()过滤反斜杠时为什么需要三个反斜杠\\\\\\?
10 回复

我想到了 JavaScript 的正则构造函数,如果要匹配 /得打 4 个
new RegExp(’////’)


这个问题其实涉及到Python字符串的转义和正则表达式转义两个层面。

简单说:你需要三个反斜杠是因为:

  1. 字符串层面:\\ 在Python字符串中表示一个实际的反斜杠
  2. 正则层面:\\ 在正则中表示一个实际的反斜杠

所以当你想用正则匹配一个反斜杠时:

  • 正则表达式需要:\\
  • 在Python字符串中写成:"\\\\"(四个反斜杠)

re.sub()的替换字符串也需要转义:

  • 替换字符串中的反斜杠在Python字符串中需要转义:\\
  • 所以替换部分写成:"\\\\"(四个反斜杠)

加起来就是:re.sub(r"\\\\", "\\\\\\", text)

看个例子:

import re

text = "path\\to\\file"  # 实际是:path\to\file
result = re.sub(r"\\", "/", text)  # 把反斜杠替换成斜杠
print(result)  # 输出:path/to/file

# 或者用三个反斜杠(不推荐,容易混乱):
result2 = re.sub("\\\\", "/", text)
print(result2)  # 输出:path/to/file

建议直接用原始字符串r"\\",这样更清晰。

总结:用原始字符串写正则表达式。

斜杠打反了。。。

bash [[]]也很反人类啊。

善用 raw string,’[\]’ --> r’\’,话说我很难理解为什么要用 ‘[]’ 去把 \ 装起来

试了三个没问题,查了下,发现四个才是标准写法

因为除了反斜杠,还有其他的符号要一起,问题里省略了

你确定不应该是 ‘[\\]’ 么
’[\]’ 对应了 4 个字符,[ 是 [,\ 是 \,] 是 ]
因为 python 在 escape 的时候,\ 后面接的字符不是有效的需转义的字符的话,\ 会被正常返回,所以

>>> print ‘]’
]
>>> ‘[\]’ == '[\\]'
True
>>> print ‘[\\]’
[\]

至于为什么要两个 \,因为在 regex 里,想要表达字面 \ 需要转义

我上面的回复里修正了,标准的应该是 4 个,只是写三个好像现在的新解释器输出结果是一样的。

尽量用 raw string,不然自己看都费尽

为什么不用 raw string…

回到顶部