Pythonic способ сделать Ruby-подобное регулярное выражение замены при оценке совпадающей строки - PullRequest
1 голос
/ 09 мая 2011

У меня есть этот простой код замены регулярного выражения с блоком в нем. Когда Ruby делает gsub совпадение передается в блок, и все, что возвращается из блока, используется в качестве замены.

string = "/foo/bar.####.tif"
string.gsub(/#+/) { | match | "%0#{match.length}d" } # => "/foo/bar.%04d.tif"

Есть ли способ сделать это в Python, сохраняя его кратким? Существует ли вариант замены ++, который поддерживает лямбда-выражения или оператор with?

Ответы [ 2 ]

8 голосов
/ 09 мая 2011

re.sub принимает функцию в качестве замены.Он получает объект сопоставления в качестве единственного параметра и возвращает строку замены.

Если вы хотите сохранить его в качестве единственного элемента, лямбда выполнит работу: re.sub(r'#+', lambda m: "%0"+str(len(m.group(0))), string).Я бы просто использовал маленькую трехстрочную def, чтобы избежать того, чтобы все эти парены были в одном месте, но это только мое мнение.

1 голос
/ 09 мая 2011

Я не очень разбираюсь в Ruby, но вы, возможно, ищете re.sub

Надеюсь, это поможет

...