Python中正则表达式匹配大括号是否需要转义?
看下面的代码,匹配字符串 a 中的三个大括号,两个正则表达式中一个对大括号进行了转义,一个没有转义,居然都能匹配成功,结果是一样的['{{{'],这是为何?是因为正则表达式中第一个大括号不是成对出现的有智能处理?
import re
a = ‘{{{}}}’
print re.findall(’{{3}’,a)
print re.findall(’{{3}’,a)
Python中正则表达式匹配大括号是否需要转义?
这题是太难还是太简单?
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,还是不能完全解释
在Python正则表达式里,匹配字面量的大括号 { 和 } 通常需要转义,因为它们有特殊含义(用于定义量词,如 {n} 匹配n次)。但有个例外:当大括号出现在没有形成有效量词模式的位置时,某些情况下可以不转义。不过为了一致性和避免意外,我强烈建议始终转义。
看几个例子就明白了:
import re
# 情况1:匹配精确的大括号字符(比如匹配 "{abc}" 这个字符串)
text = "This is a {abc} test."
pattern1 = r'\{abc\}' # 正确:转义了大括号
pattern2 = r'{abc}' # 错误:会被解释为量词,匹配失败
print(re.search(pattern1, text)) # 匹配成功
print(re.search(pattern2, text)) # 返回 None
# 情况2:量词用法(这里大括号是特殊字符,不用转义)
text2 = "aaa"
pattern3 = r'a{3}' # 正确:匹配连续3个'a'
print(re.search(pattern3, text2)) # 匹配成功
# 情况3:无效量词位置(某些情况下不转义也能工作,但不推荐)
text3 = "a{5}b"
pattern4 = r'a{5}b' # 这里 {5} 是有效量词,匹配5个a
pattern5 = r'a\{5}b' # 转义后,匹配字面字符串 "a{5}b"
print(re.search(pattern4, "aaaaab")) # 匹配成功(量词)
print(re.search(pattern5, text3)) # 匹配成功(字面大括号)
简单总结:用 \{ 和 \} 就对了,别省事儿。
查了下文档没有找到有用的信息,个人倾向于认为其采用的引擎在 parse 这个 pattern 的时候自然而然地会去检查{的合法性,包括有无闭合,以及闭合后是不是合法的一个“数字+逗号”的区间形式。如果不是的话整个会被作为正常的字符串来解析,简单说就是一个语法糖。无论何时,使用"{“来匹配”{"永远不是一个错误的选择
你说的这个合法性若替换成我后面说的小括号就是有问题的,即
a = ‘(((}}}‘
print re.findall(’({3}’,a)
这种情况是有问题的。
按照我提供的附加链接里面的说法,最正确的应该是用\{, {应该是识别不了,可能是有容错处理
做转义用的’'需不需要再次转义和语言特性有关,得看他的解析器怎么写的。据我所知好像 r 和 java 是需要\{这样写的,cpp 忘了,绝大多数文本编辑器都是不需要的
BTW,有些引擎对于’\({3}‘也是直接报错的,因为前两个表示不转义的’’,第三个’('因为不匹配直接报错(正则引擎对于小括号特别严格,大括号好像普遍放一马)

