Регулярные выражения, использующие замену для преобразования чисел

Я новичок в Python, поэтому имейте в виду, что мои навыки регулярных выражений - 122 уровня.

Мне нужно преобразовать строку с текстом, содержащим file1, в file01, но не преобразовать file10 в file010.

Моя программа неверна, но это самое близкое, что я могу подобрать, я пробовал десятки комбинаций, но не могу приблизиться:

import re
txt = 'file8, file9, file10'
pat = r"[0-9]"
regexp = re.compile(pat)
print(regexp.sub(r"0\d", txt))

Может ли кто-нибудь сказать мне, что не так с моим шаблоном и заменой, и дать мне несколько предложений?


person pythonintraining    schedule 03.10.2013    source источник


Ответы (3)


Вы можете зафиксировать число и проверить длину перед добавлением 0, но вместо этого вы можете использовать это:

import re
txt = 'file8, file9, file10'
pat = r"(?<!\d)(\d)(?=,|$)"
regexp = re.compile(pat)
print(regexp.sub(r"0\1", txt))

демонстрационная версия regex101

(?<! ... ) называется отрицательным просмотром назад. Это предотвращает (отрицательное) совпадение, если шаблон после него имеет шаблон в отрицательном просмотре назад. Например, (?<!a)b будет соответствовать всем b в строке, за исключением случаев, когда перед ним стоит a, что означает совпадение bb, cb, но не совпадение ab. Таким образом, (?<!\d)(\d) соответствует цифре, если перед ней нет другой цифры.

(\d) — это одна цифра, заключенная в группу захвата, обозначаемая простыми круглыми скобками. Захваченная группа сохраняется в первой группе захвата.

(?= ... ) — положительный прогноз. Это соответствует только, если шаблон внутри положительного просмотра совпадает после шаблона перед этим положительным просмотром. Другими словами, a(?=b) будет соответствовать всем a в строке, только если после него стоит b. ab соответствует, а ac или aa нет.

(?=,|$) — это положительный просмотр вперед, содержащий ,|$, означающий либо запятую, либо конец строки.

Таким образом, (?<!\d)(\d)(?=,|$) соответствует любой цифре, если перед ней нет цифры и есть запятая после нее, или если эта цифра находится в конце строки.

person Jerry    schedule 03.10.2013
comment
черт возьми, я написал точно такой же код, но ты меня опередил :P - person Games Brainiac; 03.10.2013
comment
@GamesBrainiac Ой, простите ^^; - person Jerry; 03.10.2013
comment
Хорошо, я должен спросить, можете ли вы объяснить логику всех символов в похлопывании? Я знаю, что \d - это цифра и | альтернатива, а остальное - особенно в таком порядке меня смущает? Я не думаю, что я когда-либо пришел бы на это самостоятельно - person pythonintraining; 03.10.2013
comment
@user2780635 user2780635 Хорошо, я сейчас добавлю объяснение. - person Jerry; 03.10.2013
comment
@user2780635 user2780635 Хех, нет причин не делать этого :) - person Jerry; 03.10.2013
comment
@user2780635 user2780635 Обновлен мой ответ с пояснениями. - person Jerry; 03.10.2013
comment
это так много объясняет, и тот веб-сайт, который вы мне дали, пригодится, еще раз спасибо, Джерри! - person pythonintraining; 03.10.2013
comment
@ user2780635 Все удовольствие мое :) - person Jerry; 03.10.2013

как насчет?

a='file1'    
a='file' + "%02d" % int(a.split('file')[1])
person VIKASH JAISWAL    schedule 03.10.2013
comment
извините, для этого задания нужно использовать регулярное выражение замены, но это гораздо более простой ответ! - person pythonintraining; 03.10.2013

Этот подход использует регулярное выражение для поиска каждой последовательности цифр и str.zfill для заполнения нулями:

>>> txt = 'file8, file9, file10'
>>> re.sub(r'\d+', lambda m : m.group().zfill(2), txt)
'file08, file09, file10'
person Janne Karila    schedule 03.10.2013