[英]Is this result for regular expression backreferencing correct?
我在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(以及許多其他Regex引擎)中,組0被視為整個輸入,而匹配組從1開始。在Python的re模塊中,組從0開始,因為整個字符串都是您的輸入。
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'
返回一個包含匹配項所有子組的元組,從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
是組名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.