2013-06-04 1 views
2

Я столкнулся с проблемой во время игры в Python: когда я создаю случайную строку, скажем, «тест 1981», следующий вызов Python возвращается с пустую строку.Python Regex: знак вопроса (?) Не совпадает с серединой строки

>>> re.search('\d?', "test 1981").group() 
'' 

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

+1

Ваша интерпретация звучит правильно. '\ d?' * может * совпадать с нулевыми символами, поэтому он делает именно это. '\ d' вместо этого должно совпадать с числом. –

+0

Ahh, gotchapons. Спасибо за разъяснения. :) – Zhouster

ответ

3

Ваш шаблон соответствует цифре или пустой строке. Он начинается с первого символа и пытается сопоставить цифру, то, что он делает дальше, пытается сопоставить альтернативу, означает пустую строку, в которой найдена совпадение перед первым символом.

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

Использование дополнительного квантора имеет смысл только в сочетании с необходимой частью, что вы хотите цифру с последующим опциональным:

>>> re.search('\d\d?', "test 1981").group() 
'19' 

В противном случае ваш шаблон всегда верно.

+0

Благодарим вас за быстрый ответ и потрясающую ясность в вашем ответе. :) Гораздо понятнее и имеет гораздо больше смысла! – Zhouster

1

Regex

\d? 

просто означает, что он должен необязательно (?) совпадают одна цифра (\d).

Если вы используете что-то вроде этого, он будет работать, как вы ожидаете (соответствует одной цифры в любом месте строки):

\d 
+0

Благодарим за отзыв. Имеет смысл. :) – Zhouster

1

re.search('\d?', "test 1981").group() жадностью матчей первого матча паттерна (0 или 1 цифры), то могу найти. В этом случае это нулевые цифры. Обратите внимание, что re.search('\d?', "1981 test").group() фактически соответствует строке '1' в начале строки. То, что вы, вероятно, ищете здесь, это re.search('\d+', "test 1981").group(), который находит всю строку 1981 независимо от того, где она находится.

+0

Спасибо! Это облегчает проблему жадности. – Zhouster