2013-05-22 1 views
0

Я использовал Javascript в командной строке клиента MongoDB v2.2.4 запустить следующее регулярное выражение ссылочность:Является ли этот результат регулярным обратным преобразованием регулярных выражений правильным?

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

Я думал, что я должен получить [ «B», «A»], но я получил дополнительный элемент «BA» в начале массива. Я попробовал то же самое регулярное выражение ссылочность в Python, вернувшиеся результаты является то, что я ожидал, следующим образом:

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

Таким образом, я могу сказать результат регулярного выражения ссылочность от Javascript в MongoDB не так?

+1

Пожалуйста, разместите текст, а не изображения. –

+2

Кроме того, нет обратного вызова. –

ответ

3

MongoDB результат включает в себя всю строку соответствие с или группу 0, а также группы 1 и 2.

питон .groups() метод возвращает только захваченные группы. Способ .group() бы, без аргументов, возвращение группы-тоже:

>>> 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 это название группы.

+0

Благодарим вас за объяснение обратных ссылок. В демонстрации мы также можем написать регулярное выражение как re.search (r '([AB]) {2}', 'BB'), если мы не хотим использовать обратные ссылки, не так ли? – user2384994

+1

@ user2384994: Правильно. –

3

В JavaScript (и многих других двигателях Regex) Группа 0 считается всем входом, а группы сопоставлений начинаются с 1. В модуле re-python группы начинаются с 0, поскольку вся строка является вашим вводом.

+0

для чего это стоит. Думаю, подход Python имеет больше смысла, я думаю, что старое поведение так долго выжило, что регулярные выражения выглядят как черная магия для большинства людей, поэтому нарушение кода, связанного с ними, является дополнительным страшным. –

Смежные вопросы