正则表达式反向引用的结果是否正确?

时间:2013-05-22 20:27:48

标签: javascript python regex mongodb

我在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的正则表达式反向引用的结果是错误的吗?

2 个答案:

答案 0 :(得分:3)

在JavaScript(以及许多其他Regex引擎)中,组0被视为整个输入,而匹配组从1开始。在Python的模块中,组从0开始,因为整个字符串是您的输入。 / p>

答案 1 :(得分:3)

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

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'

这是documented in the re module documentation

  

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

.group()方法:

  

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

请注意,表达式中没有反向引用。反向引用将会是这样的:

'([AB])\1'

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

演示:

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

请注意,只有BB匹配, BA

您也可以使用命名组:

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

其中a_or_b是组名。