Python 正则匹配大括号不需要转义?

2018-07-24 11:58:48 +08:00
 pheyer

看下面的代码,匹配字符串 a 中的三个大括号,两个正则表达式中一个对大括号进行了转义,一个没有转义,居然都能匹配成功,结果是一样的['{{{'],这是为何?是因为正则表达式中第一个大括号不是成对出现的有智能处理?

import re

a = '{{{}}}'
print re.findall('{{3}',a)
print re.findall('\{{3}',a)
4714 次点击
所在节点    Python
5 条回复
pheyer
2018-07-24 16:45:01 +08:00
这题是太难还是太简单?
import re

a = '{{{}}}'
print re.findall('{{3}',a)
print re.findall('\{{3}',a)
print re.findall('\\{{3}',a)
上面的代码输出同样的结果,都能匹配到三个大括号。

而把匹配的左大括号换成左括号时,第一个 print 会报错,后面两个就没有问题,说明并不是遇到不是成对处理的括号有智能处理?
import re

a = '(((}}}'
print re.findall('({3}',a)
print re.findall('\({3}',a)
print re.findall('\\({3}',a)

参考了一下 https://www.cnblogs.com/dyfblog/p/6088582.html,还是不能完全解释
VicaYang
2018-07-26 01:51:26 +08:00
查了下文档没有找到有用的信息,个人倾向于认为其采用的引擎在 parse 这个 pattern 的时候自然而然地会去检查{的合法性,包括有无闭合,以及闭合后是不是合法的一个“数字+逗号”的区间形式。如果不是的话整个会被作为正常的字符串来解析,简单说就是一个语法糖。无论何时,使用"\{"来匹配"{"永远不是一个错误的选择
pheyer
2018-07-26 09:41:17 +08:00
@VicaYang 你说的这个合法性若替换成我后面说的小括号就是有问题的,即
a = '(((}}}'
print re.findall('({3}',a)
这种情况是有问题的。
按照我提供的附加链接里面的说法,最正确的应该是用\\{, \{应该是识别不了,可能是有容错处理
VicaYang
2018-07-26 10:04:40 +08:00
做转义用的'\'需不需要再次转义和语言特性有关,得看他的解析器怎么写的。据我所知好像 r 和 java 是需要\\{这样写的,cpp 忘了,绝大多数文本编辑器都是不需要的
VicaYang
2018-07-26 10:10:13 +08:00
BTW,有些引擎对于'\\({3}'也是直接报错的,因为前两个表示不转义的'\',第三个'('因为不匹配直接报错(正则引擎对于小括号特别严格,大括号好像普遍放一马)

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

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

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

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

© 2021 V2EX