Есть ли способ, чтобы re.sub сообщал о каждой произведенной замене?Python

Программы на Python
Anonymous
Есть ли способ, чтобы re.sub сообщал о каждой произведенной замене?

Сообщение Anonymous »

TL;DR: Как заставить re.sub распечатать, какие замены он делает, в том числе при использовании групп?
Что-то вроде подробной опции, это возможно ли, чтобы re.sub распечатывал сообщение каждый раз, когда он производит замену? Это было бы очень полезно для тестирования того, как несколько строк re.sub взаимодействуют с большими текстами.
Мне удалось найти обходной путь для простых замен с использованием тот факт, что аргумент repl может быть функцией:

Код: Выделить всё

import re

def replacer(text, verbose=False):
def repl(matchobj, replacement):
if verbose:
print(f"Replacing {matchobj.group()} with {replacement}...")
return replacement
text = re.sub(r"[A-Z]+", lambda m: repl(m, "CAPS"), text)
text = re.sub(r"\d+", lambda m: repl(m, "NUMBER"), text)
return text

replacer("this is a 123 TEST 456", True)

# Log:
#   Replacing TEST with CAPS...
#   Replacing 123 with NUMBER...
#   Replacing 456 with NUMBER...
Однако это не работает для групп — похоже, что re.sub автоматически экранирует возвращаемое значение repl:

Код: Выделить всё

def replacer2(text, verbose=False):
def repl(matchobj, replacement):
if verbose:
print(f"Replacing {matchobj.group()} with {replacement}...")
return replacement
text = re.sub(r"([A-Z]+)(\d+)", lambda m: repl(m, r"\2\1"), text)
return text

replacer2("ABC123", verbose=True) # returns r"\2\1"

# Log:
#   Replacing ABC123 with \2\1...
Конечно, можно написать более сложную функцию repl, которая фактически проверяет наличие заменяемых групп, но на этом этапе такое решение кажется слишком сложным для поставленной цели. просто заставить re.sub сообщать о заменах. Другим потенциальным решением было бы просто использовать re.search, сообщить об этом, а затем использовать re.sub для замены, возможно, используя вариант Pattern.sub, чтобы указать pos и endpos, чтобы избавить функцию sub от необходимости повторного поиска по всей строке. Наверняка есть способ лучше, чем любой из этих вариантов?

Подробнее здесь: https://stackoverflow.com/questions/781 ... t-it-makes

Вернуться в «Python»