2016-04-17 3 views
0

При попытке выполнить некоторое регулярное выражение в python я наткнулся на странность. Я хотел сопоставить десятичные числа в форме xxx.yyy и разделить их на три группы для дальнейшей обработки. Я выполнил что-то вроде следующего фрагмента.Python regex не достаточно жадный, несколько групп

#!/usr/bin/env python3 

import re 

matches = re.search("a=(\d+)(\.?)(\d+?)", "var k = 2;var a; a=46") 
print(matches.group(1)) 

Печать возвращает 4, тогда как 46 будет ожидаемым результатом. Почему это так? Документация на Python гласит, что regexp + и * являются жадными, но, похоже, это не так. Причина в том, что последняя цифра заканчивается в последней группе. Мне нужно как минимум совместить первую и последнюю группу. Я мог бы пропустить среднюю группу, если я использую последнее, чтобы различать десятичные и не десятичные числа.

Однако, как представляется, это работает, если число соответствует десятичному значению.

#!/usr/bin/env python3 

import re 

matches = re.search("a=(\d+)(\.?)(\d+?)", "var k = 2;var a; a=46.3") 
print(matches.group(1)) 

Отпечатки 46. Я был бы очень рад, если бы вы помогли мне решить эту головоломку. Спасибо.

ответ

1

У вас есть две группы знаков после запятой, по крайней мере, 1 разряд. Итак, группа 1 - 4, а группа 2 пуста, а группа 3 - 6. Если вы хотите, чтобы соответствовать все цифры перед ., чтобы соответствовать, вы должны сделать второй и третьей группы по выбору:

matches = re.search("a=(\d+)(?:(\.?)(\d+))?", "var k = 2;var a; a=46") 
+0

Сделал некоторую оценку, и я считаю, что этот ответ ближе всего к тому, чего я хотел достичь. Спасибо, @ Даниэль. – Fakenick

2

Это должно быть

matches = re.search("a=(\d+(?:\.\d+)?)", "var k = 2;var a; a=46") 

Ideone Demo

Причина

Ваше регулярное выражение

(\d+)(\.?)(\d+?) 

Ваш . является необязательным, что означает, что ваши оба . и следующие \d+? не зависят друг от друга. Это означает, что он сначала соответствует всем цифрам (т. до 4 в вашем примере) вашего ввода до следующего ., который является необязательным, и для достижения последней группы требуется хотя бы одна цифра. Таким образом, 6 будет в последней захваченной группе.

Эта фотография сделает более ясным

enter image description here

+0

Какая программа/сайт является то, что скриншот из? Выглядит круто – Keatinge

+1

@ Racialz его от http://www.regex101.com/ после написания регулярного выражения вы можете использовать режим отлаживателя регулярного выражения (отображается в левой части) на этом сайте – rock321987

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