Python中re.sub()过滤反斜杠时为什么需要三个反斜杠\\\\\\?
一个字符串 string_a 中可能有反斜杠 \ 这个字符,用 re.sub()过滤掉它,为什么要打三个反斜杠 \\\ 才行呢?
这个 \ 到底谁在转义谁呀
re.sub('[\\\]', 'repl', string_a)
Python中re.sub()过滤反斜杠时为什么需要三个反斜杠\\\\\\?
我想到了 JavaScript 的正则构造函数,如果要匹配 /得打 4 个
new RegExp(’////’)
这个问题其实涉及到Python字符串的转义和正则表达式转义两个层面。
简单说:你需要三个反斜杠是因为:
- 字符串层面:
\\在Python字符串中表示一个实际的反斜杠 - 正则层面:
\\在正则中表示一个实际的反斜杠
所以当你想用正则匹配一个反斜杠时:
- 正则表达式需要:
\\ - 在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…

