2015-07-15 4 views
0

Я пытаюсь разобрать текстовый документ с данными в следующем формате: 24036 -977. Мне нужно разделить числа на отдельные значения, и то, как я это сделал, - это следующие шаги.Python Regex Behavior

values = re.search("(.*?)\s(.*)") 
x = values.group(1) 
y = values.gropu(2) 

Это делает работу, но мне было любопытно, почему использование (. *?) Во второй группе вызывает регулярное выражение на провал? Я тестировал его в онлайн-тесте регулярного выражения (https://regex101.com/r/bM2nK1/1) и добавлял? в результате вторая группа ничего не возвращает. Теперь, насколько я знаю, .*? означает использовать любое значение неограниченное количество раз, насколько это возможно, и .* - это только жадная версия этого. Что меня смущает, почему не жадная версия .*? берет это определение, чтобы ничего не понимать?

+0

[обязательный для чтения] (http://www.rexegg.com/regex-quantifiers.html#lazy_solution). –

+0

@stribizhev также http://programmers.stackexchange.com/questions/113237/when-you-should-not-use-regular-expressions – Scironic

+0

@JustinWang не забудьте отметить ответ, наиболее подходящий для вашей проблемы, как правильный. – Scironic

ответ

3

Потому что это означает, что соответствует предыдущему токену, *, как можно меньше раз, что равно 0 раз. Если вы хотите продолжить до конца строки, добавьте $, который соответствует концу строки. Если вы хотите, чтобы он соответствовал хотя бы одному, используйте + вместо *.

Причина первая группа .*? матчи 24036 потому, что у вас есть \s маркер после него, так что наименьшее количество символов, .*? может соответствовать и следовать \s является 24036.

1

@iobender указал на ответ на ваш вопрос.

Но я думаю, что стоит отметить, что если числа разделяются пробелом, вы можете просто использовать split:

>>> '24036 -977'.split() 
['24036', '-977'] 

Это проще, легче понять и часто быстрее, чем regex.

+0

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

+0

@JustinWang, не проблема - я знаю многих людей, которые по умолчанию используют 'regex' для простейших вещей, всегда стоит попробовать другой маршрут. – Scironic