2013-11-25 3 views
3

Я узнаю о регулярном выражении в Python, и у меня проблемы с пониманием функции groups().Метод groups() в регулярных выражениях в Python

>>> m = re.match("([abc])+", "abc") 

Здесь я определил класс [ABC], который, как я знаю, означает любой из символов от а до с. Он определен внутри группы, а знак + означает, что мы хотим, по крайней мере, одну из таких групп. Поэтому я выполняю следующую строку, и результат понятен:

>>> m.group() 
'abc' 
>>> m.group(0) 
'abc' 

Я понимаю, почему это происходит. Индекс основной группы равен 0, а «abc» соответствует классу, который мы определили. До сих пор так хорошо, но я не понимаю, почему следующие строки получить выполняются так, как они это делают:

>>> m.group(1) 
'c' 
>>> m.groups() 
('c',) 

Что группа (1), я только определить одну группу здесь и почему функция группы имеет только символ 'c' в нем? Разве не предполагается возвращать кортеж, содержащий все группы? Я бы предположил, что он по крайней мере будет содержать «abc».

ответ

7

Для re деталей обратитесь docs. В вашем случае:

group(0) стендами для всех совпавшей строки, следовательно abc, то есть 3 группы a, b и c

group(i) обозначает i-й группы, а также со ссылкой на документацию

Если A групповые совпадения несколько раз, доступно только последнее совпадение

следовательно group(1) обозначает последний матч, c

Ваш + интерпретируется как группа repetation, если вы хотите повторить [abc] внутри группы, переместить + в скобках:

>>> re.match("([abc])", "abc").groups() 
('a',) 
>>> re.match("([abc]+)", "abc").groups() 
('abc',) 
+0

Если это так, то почему в этом примере группы () сохраняет все группы в кортеже: '>>> p = re.compile ('(a (b) c) d')' '>>> m = p.match ('abcd') ' ' >>> m.group (2,1,2) ' ' ('b', 'abc', 'b') ' – Omid

+2

В этом примере создаются две разные группы, которые отличаются от одной группы, совпадающей несколько раз с' + 'или' * 'повторение. –

1

От docs:

Если группа соответствует несколько раз, только последний матч доступен:

>>> m = re.match(r"(..)+", "a1b2c3") # Matches 3 times. 
>>> m.group(1)      # Returns only the last match. 
'c3' 

Ваша группа может только когда-либо соответствовать одному символу, так c является последний матч.

Вы сказали, что вы ожидали бы, по крайней мере, видеть 'abc' - если вы хотите, чтобы ваша группа, чтобы соответствовать несколько символов, положить + внутри группы:

>>> m = re.match("([abc]+)", "abc") 
Смежные вопросы