Шаблон регулярного выражения Python захватывает цифры минимальным образом - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь получить мили и соединить целочисленные значения из строки типа "at (17.08)".Ложная десятичная форма входных данных - выбор администратора данных.Сначала я попробовал следующий шаблон для этой строки «17.08»:

"((\d+)\.(\d\d))"

Это вело себя правильно:

group(0) is "17.08"
group(1) is "17.08"
group(2) is "17"
group(3) is "08"

, но теперь для «at (17.08) есть вариант»: Iхочу иметь возможность заменить правильно отформатированное местоположение для десятичной нотации следующим образом:

".*\(?((\d+)\.(\d\d))\)?.*"

При запросе re.match я получаю следующие группы совпадений:

group(0) is "(17.08)", OK.
group(1) is "7.08", where is the 1 going ?
group(2) is "7", where is the 1 going ?
group(3) is "08", still OK.

Что я делаю не так?Почему «ре» ведет себя так?У меня есть идея, это должно быть связано с "жадной" / "не жадной" темой, но как?

1 Ответ

0 голосов
/ 26 ноября 2018

Причина в том, что часть .*\(? в префиксе поглощает 1 на входе, так как открывающая скобка является необязательной, а .* жадным.Мой способ решения этой проблемы - использовать следующее регулярное выражение (обратите внимание на пробел после первого *):

".* \(?((\d+)\.(\d\d))\)?.*"

Предполагая, что у вас всегда есть пробел перед открывающей скобкой (еслинастоящее время) или номер.

...