0

我在 MongoDB v2.2.4 的命令行客户端中使用了 Javascript 来运行以下正则表达式反向引用:

> /([AB])([AB])/("BA")
[ "BA", "B", "A" ]

我原以为我应该得到 ["B","A"] 但我在数组的开头得到了一个额外的元素 "BA"。我在 Python 中尝试了相同的正则表达式反向引用,返回的结果是我所期望的,如下所示:

>>> re.search('([AB])([AB])','BA').groups()
('B', 'A')

那么,我可以说MongoDB中Javascript的正则表达式反向引用的结果是错误的吗?

4

2 回答 2

3

在 JavaScript(和许多其他正则表达式引擎)中,组 0 被认为是整个输入,而匹配组从 1 开始。在 Python 的 re 模块中,组从 0 开始,因为整个字符串是您的输入。

于 2013-05-22T20:31:20.377 回答
3

MongoDB 结果包括整个匹配的字符串,或组 0,以及组 1 和 2。

Python.groups()方法仅返回捕获的组。该.group()方法在没有参数的情况下也将返回组 0:

>>> re.search('([AB])([AB])', 'BA').groups()
('B', 'A')
>>> re.search('([AB])([AB])', 'BA').group()
'BA'
>>> re.search('([AB])([AB])', 'BA').group(1)
'B'
>>> re.search('([AB])([AB])', 'BA').group(2)
'A'
>>> re.search('([AB])([AB])', 'BA').group(0)
'BA'

记录在re模块文档中:

返回一个包含匹配的所有子组的元组,从 1 到模式中有多少组。

对于.group()方法:

返回匹配的一个或多个子组。如果只有一个参数,则结果为单个字符串;如果有多个参数,则结果是一个元组,每个参数一个项目。如果没有参数,group1默认为零(返回整个匹配项)。

请注意,您的表达式中没有反向引用。相反,反向引用看起来像这样:

'([AB])\1'

其中\1指的是它之前的捕获组。反向引用只会匹配被引用组匹配的完全相同的字符。

演示:

>>> re.search(r'([AB])\1', 'BA')
>>> re.search(r'([AB])\1', 'BB')
<_sre.SRE_Match object at 0x107098210>

注意 onlyBB是如何匹配的,而不是 BA.

您也可以使用命名组:

'(?P<a_or_b>[AB])(?P=a_or_b)'

a_or_b组名在哪里。

于 2013-05-22T20:31:44.187 回答