字符类中的Python正则表达式引擎转义括号

字符类中的Python正则表达式引擎转义括号,python,regex,python-2.7,python-3.x,Python,Regex,Python 2.7,Python 3.x,为什么在python中,如果我们在字符类中使用2个括号而不在匹配时转义它们[],而不是]或[: >>> re.search(r'[[]]','[]').group() '[]' >>> re.search(r'[[]]','[').group() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneTy

为什么在python中,如果我们在字符类中使用2个括号而不在匹配时转义它们
[]
,而不是
]
[

>>> re.search(r'[[]]','[]').group()
'[]'
>>> re.search(r'[[]]','[').group()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'

左括号开始一个新的字符类,其作用域在遇到第一个右括号时即结束

现在,考虑你的正则表达式:

[[]]
字符类的范围从第一个
[
开始,在第三个位置结束。因此,正则表达式只不过是,
[
(在字符类中)后跟
]
(最后一个字符)。因此,它显然与
[
不匹配

但是,一旦您转义第一个
]
,它就会失去关闭字符类的行为。因此,在下面的正则表达式中:

[[\]]
字符类仅在最后一个
]
关闭。因此,正则表达式将匹配
[
]


注意:在字符类中没有任何需要逃出<代码> [< /代码>,因为它没有特殊的行为。它不能在字符类中启动新的字符类,也不能关闭现有的字符类。

一旦正则表达式引擎找到<代码> [/COD] >,它就认为这是char类的结尾。所以我们有。(
[[]/code>=
[
)+(
]
=
]
)它内部匹配
[]
,但无法匹配
[
,因为它需要另一个
]
@AvinashRaj是的,我认为这就是原因!请注意,您可以使用此技巧使用两个括号定义字符类,而无需任何转义:
[]
(之所以有效,是因为不允许使用空字符类,并且第一个右括号被视为文字字符)@CasimiretHippolyte耶!
[[\]]