Есть ли способ, чтобы 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Re.sub съедает следующий символ при замене на другой
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Re.sub съедает следующий символ при замене на другой
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Переопределите атрибут класса типа универсального типа с помощью примеси, чтобы mypy не сообщал, что он несовместим.
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Необходимо ли использовать std::move при замене двух объектов?
    Гость » » в форуме C++
    0 Ответы
    43 Просмотры
    Последнее сообщение Гость
  • RegEx идеально соответствует, но пропускает совпадения при замене
    Гость » » в форуме Javascript
    0 Ответы
    57 Просмотры
    Последнее сообщение Гость

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