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

1

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

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

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

  • 0
    Было бы полезно включить пример предполагаемого вывода для людей, не знакомых с ruby.
  • 0
    @zeekay: ожидаемый результат - в комментарии после второй строки.
Показать ещё 1 комментарий
Теги:
block
coding-style

2 ответа

8
Лучший ответ

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

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

  • 0
    Я пошел на вложенный def на этот раз, большое спасибо! хитрость здесь была в группе (0), так как стандартная функция str () для SRE_Match не так полезна, как to_s () в Ruby
1

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню