Почему re.groups () не даст мне ничего для моей единственно правильно подобранной группы? - PullRequest
28 голосов
/ 05 сентября 2011

Когда я запускаю этот код:

print re.search(r'1', '1').groups() 

Я получаю результат ().Тем не менее, .group(0) дает мне совпадение.

Разве groups() не должно дать мне что-то, содержащее совпадение?

Обновление: спасибо за ответы.Так что это значит, что если у меня re.search() без подгрупп, у меня есть , чтобы использовать groups(0), чтобы получить совпадение?

Ответы [ 4 ]

22 голосов
/ 05 сентября 2011

Насколько мне известно, .groups() возвращает кортеж из запомненных групп .Т.е. те группы в регулярном выражении, которые заключены в скобки.Поэтому, если бы вы написали:

print re.search(r'(1)', '1').groups()

, вы бы получили

('1',)

в качестве ответа.В общем случае .groups() вернет кортеж всех групп объектов в регулярном выражении, заключенных в скобки.

20 голосов
/ 05 сентября 2011

groups пусто, так как у вас нет групп захвата - http://docs.python.org/library/re.html#re.MatchObject.groups. group (0) всегда будет возвращать весь сопоставленный текст независимо от того, был ли он захвачен в группе или нет

Edited.

4 голосов
/ 05 сентября 2011

Причина этого в том, что у вас нет групп захвата (поскольку вы не используете () в шаблоне). http://docs.python.org/library/re.html#re.MatchObject.groups

И group(0) возвращает весь результат поиска (даже если у него вообще нет групп захвата): http://docs.python.org/library/re.html#re.MatchObject.group

2 голосов
/ 05 сентября 2011

В вашем регулярном выражении нет групп, поэтому в результате вы получите пустой список (()).

Попробуйте

re.search(r'(1)', '1').groups()

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

Тогда вы получите

('1',)

в качестве результата.

...