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