re.sub() 过滤反斜杠 \ 为什么要打三个反斜杠 \\\ 才行呢?

2017-09-22 13:36:00 +08:00
 rogwan

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

re.sub('[\\\]', 'repl', string_a)
4248 次点击
所在节点    Python
9 条回复
noe132
2017-09-22 13:47:29 +08:00
我想到了 JavaScript 的正则构造函数,如果要匹配 /得打 4 个
new RegExp('////')
noe132
2017-09-22 13:47:50 +08:00
斜杠打反了。。。
charove
2017-09-22 13:48:43 +08:00
bash [[]]也很反人类啊。
rogerchen
2017-09-22 14:13:14 +08:00
善用 raw string,'[\\\]' --> r'\\',话说我很难理解为什么要用 '[]' 去把 \ 装起来
rogwan
2017-09-22 14:35:14 +08:00
@noe132 试了三个没问题,查了下,发现四个才是标准写法

@rogerchen 因为除了反斜杠,还有其他的符号要一起,问题里省略了
hahastudio
2017-09-22 14:39:05 +08:00
你确定不应该是 '[\\\\]' 么
'[\\\]' 对应了 4 个字符,[ 是 [,\\ 是 \,\] 是 \]
因为 python 在 escape 的时候,\ 后面接的字符不是有效的需转义的字符的话,\ 会被正常返回,所以

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

至于为什么要两个 \,因为在 regex 里,想要表达字面 \ 需要转义
rogwan
2017-09-22 14:43:16 +08:00
@hahastudio 我上面的回复里修正了,标准的应该是 4 个,只是写三个好像现在的新解释器输出结果是一样的。
Cooky
2017-09-22 14:47:24 +08:00
尽量用 raw string,不然自己看都费尽
Osk
2017-09-22 14:56:50 +08:00
为什么不用 raw string...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/392815

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX