2011-01-24 5 views
1

У меня возникли проблемы с выяснением, почему следующее регулярное выражение не работает.Начало (python) regex question

Я знаю, что я могу сформировать другие регулярные выражения, чтобы сделать эту работу, но я думал, что это должно работать.

re.search ("(\d*)", "prefix 1234 suffix").groups() 
('',) 

Интересно, FindAll, кажется, работает:

re.findall("(\d*)", "prefix 1234 suffix") 
['', '', '', '', '', '', '', '1234', '', '', '', '', '', '', '', ''] 

Я понимаю, почему это работает, но я до сих пор путают, почему не работает поиск? Я понимаю, что матч должен заставить его соответствовать всей строке, но поиск должен найти цифры в любом месте в пределах строки

ответ

6

Потому что .search запускает поиск один раз и соответствует в первую очередь, он может. Поскольку \d* не может содержать никаких символов, первое место, которое оно может соответствовать, находится в начале строки, не захватывая никаких символов, поэтому первая группа захвата - ''. Он делает именно то, что вы просили.

Если вы сделали регулярное выражение (\d+) вместо, который должен соответствовать по крайней мере один цифру, то первое место, это могло бы соответствовать на 1 и было бы захватить 1234.

1

Попробуйте это:

re.findall("(\d+)", "prefix 1234 suffix") 

Изменяя * к + вы показываете что шаблон \d должен соответствовать 1 или более раз. Сначала использовалось *, совпадающее с нулем или более раз, которое соответствовало каждому символу в строке.

+0

Я добавил немного к моему вопросу, чтобы уточнить мое замешательство. Я понимаю, что findall будет работать, но задавался вопросом, почему поиск не работает. – Hortitude

3

Это работает. Возвращаемые значения вашего первого примера соответствуют первому элементу возвращаемого значения findall. Просто используйте: r'(\d+)' как ваше регулярное выражение.

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

3

\d+, а не \d*. \d* означает ноль или более, и что ноль - это то, что вы получаете на смещение 0 в строке.