簡體   English   中英

正則表達式反向引用的結果正確嗎?

[英]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'

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>

注意如何只匹配BB 而不匹配BA

您也可以使用命名組:

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

其中a_or_b是組名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM