2014-10-14 5 views
5

У меня есть ниже код:результат Регулярное выражение

import re 

line = "78349999234"; 

searchObj = re.search(r'9*', line) 

if searchObj: 
    print "searchObj.group() : ", searchObj.group() 
else: 
    print "Nothing found!!" 

Однако выход пуст. Я думал, что * означает: вызывает результирующий RE, чтобы он соответствовал 0 или более повторениям предыдущего RE, столько повторений, сколько возможно. ab* будет соответствовать ‘a’, ‘ab’, или ‘a’, за которым следует любое число ‘b’. Почему я не вижу результата в этом случае?

+0

Почему вы вставили скриншот своего вопроса в свой вопрос? Это не имеет никакого отношения к этому вопросу. Если у вас есть вопрос о StackOverflow, отправьте его в [Meta StackOverflow] (http://meta.stackoverflow.com/), а не в середине несвязанного вопроса. – abarnert

ответ

5

Я думаю, что регулярное выражение соответствует слева направо. Таким образом, первым шаблоном, который соответствует, является пустая строка до 7.... Если он найдет 9, он действительно будет соответствовать ему жадным: и попробуйте «поесть» (это правильная терминология) как можно больше символов.

Если вы запрашиваете:

>>> print(re.findall(r'9*',line)); 
['', '', '', '', '9999', '', '', '', ''] 

Это соответствует все пустые строки между символами и, как вы можете видеть, 9999 подобран, а также.

Основная причина, вероятно, в производительности: если вы ищете шаблон в строке из символов 10M +, вы очень счастливы, если шаблон уже находится в первых десятизначных символах. Вы не хотите тратить усилия на поиске «красивых» матч ...


EDIT

С 0 или больше появления один означает группу (в данном случае 9) повторяется ноль или более раз. В пустой строке символы повторяются ровно 0 раз. Если вы хотите, чтобы соответствовать моделям, где символы повторяются один или несколько раз, вы должны использовать

9+ 

Это приводит к:

>>> print(re.search(r'9+', line)); 
<_sre.SRE_Match object; span=(4, 8), match='9999'> 

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

+0

Спасибо, Что означает 0 или более случаев? И в настоящее время я не могу увидеть цитату в stackoverflow. Он выглядит размытым. Любая причина для этого? – user3369157

+0

Ответ не объясняет, что OP, вероятно, хочет: '9 +' вместо '9 *'. – abarnert

+0

@abarnert: модифицировано ... –

1

Основная причина в том, что функция re.search прекращает поиск строк, как только находит совпадение. 9* означает совпадение цифр 9 zero или больше раз. Поскольку перед каждым символом существует пустая строка, функция re.search останавливает ее поиск после поиска первой пустой строки. Вот почему вы получили пустую строку в качестве вывода ...

Смежные вопросы