【问题标题】:Is this result for regular expression backreferencing correct?这个正则表达式反向引用的结果是否正确?
【发布时间】:2013-05-18 01:12:54
【问题描述】:

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

【问题讨论】:

  • 请发布文字而不是图片。
  • 另外,没有反向引用发生。

标签: javascript python regex mongodb


【解决方案1】:

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

【讨论】:

  • 对于它的价值,我认为 Python 的方法更有意义,我认为旧的行为已经存在了很长时间,因为正则表达式对大多数人来说就像是黑魔法,所以破坏与它们相关的代码更加可怕。
【解决方案2】:

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'

这是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 是组名。

【讨论】:

  • 感谢您对反向引用的解释。在演示中,如果我们不想使用反向引用,我们也可以将正则表达式写成 re.search(r'([AB]){2}','BB') 对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多