2017-02-09 15 views
0

С учетом строки abc. цель состоит в том, чтобы разбить ее на две группы: abc и .. На самом деле, меня интересует только группа до ..Почему re.search не получает нужную группу, пока re.findall ее получает?

>>> import re 
>>> text = 'abc.' 
>>> re.search('^(\S+)\.$', text).group(0) 
'abc.' 
>>> re.findall('^(\S+)\.$', text) 
['abc'] 

Почему re.search не получает нужную группу, а re.findall будет получать его?

Другой пример, где вход abc.def., то ожидать выход изолировать окончательный fullstop и получить abc.def и .. Так re.findall получают его по своему желанию:

>>> re.findall('^(\S+)\.$', text) 
['abc.def'] 

Но re.search комков окончательного fullstop в первую группу.

>>> re.search('^(\S+)\.$', text).group(0) 
'abc.def.' 

Возможно ли re.search('^(\S+)\.$', text).group(0) вернуться только abc.def? Есть ли какие-то флаги, которые нужно установить?

+2

Номера групп начинаются с 1. – user2357112

ответ

2

Потому что вы просите не ту группу. Группа 0 - это полное совпадение, в которое входит точка. Группа 1 - первая группа захвата в матче. Это все указано в документах для объекта match, который возвращается re.search. Если вам абсолютно необходимо что-то ноль, используйте re.search(...).groups()[0].

2

Номера групп начинаются с 1, поэтому вы хотите group(1). group(0) - весь текст матча.