2015-10-29 3 views
1

Я пытаюсь найти подстроку с этой схемой: .*(_\d+)?питон re.search с дополнительным параметром

Пример:

abc_4 
abc_345 
abc 

Просто одной очередной строки, а затем необязательный «_», а затем по крайней мере, одну цифру.

Но когда я использую:

re.search("(.*)(_\d+)?" , str).group(1) 

она всегда возвращает всю строку.

+0

Посмотрите на регулярное выражение жадности. – Barmar

+0

Может ли вход быть 'abc_def_123' (с несколькими символами' _')? – Barmar

+0

более конкретно, с тем, что вы не хотите захватывать перед цифрами .... '\ w'. –

ответ

0

Проблема заключается в том, что * жаден, он пытается соответствовать максимально возможной строки, так долго, как остальная часть регулярного выражения могут совпадать. Поскольку часть после _ является необязательной, .* может сожрать ее, так как остальная часть регулярного выражения может соответствовать пустой строке.

Изменить .* на [^_]* так, чтобы оно не соответствовало знаку подчеркивания перед номером.

([^]*)(_\d+)? 
1

вместо (.*) использование [^_]*? для остановки в начале _ знак.

+1

Нет необходимости в'? '. '[^ _] *' останавливается при первом символе '_', является ли он жадным или нет. – Barmar

1

Вы сделали _nnn часть дополнительно (?), поэтому .* соответствует всей строке всегда (жадный). Сделать это не жадный:

.*?(_\d+)? 
Смежные вопросы