Сообщить об ошибке.

Функция sub() модуля re в Python

Поиск и замена на основе регулярного выражения

Синтаксис:

import re

re.sub(pattern, repl, string, count=0, flags=0)

Параметры:

  • pattern - строка шаблона регулярного выражения,
  • repl - строка замены,
  • string - строка для поиска,
  • count=0 - число, максимальное число вхождений pattern,
  • flags=0 - один или несколько флагов.

Возвращаемое значение:

Описание:

Функция sub() модуля re возвращает строку, полученную путем замены крайнего левого неперекрывающегося вхождения шаблона регулярного выражения pattern в строке string на строку замены repl. Если шаблон регулярного выражения не найден, строка возвращается без изменений.

Аргумент repl может быть строкой или функцией. Если repl это строка, то в ней обрабатываются все обратные слеши. То есть \n преобразуется в один символ новой строки, \r преобразуется в возврат каретки и т. д. Неизвестные экранированные ASCII-буквы - зарезервированы для дальнейшего использования и рассматриваются как ошибки. Другие неизвестные экранированные символы, такие как \& остаются без изменений. Обратные ссылки, такие как \6, заменяются подстрокой, соответствующей группе №6 в шаблоне.

>>> import re
>>> re.sub(r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):',
...        r'static PyObject*\npy_\1(void)\n{',
...        'def myfunc():')
# 'static PyObject*\npy_myfunc(void)\n{'

Если repl является функцией, то она вызывается для каждого неперекрывающегося вхождения паттерна. Функция принимает один аргумент объект совпадения и возвращает строку замены.

>>> import re
>>> def dashrepl(matchobj):
...     if matchobj.group(0) == '-': return ' '
...     else: return '-'
>>> re.sub('-{1,2}', dashrepl, 'pro----gram-files')
# 'pro--gram files'
>>> re.sub(r'\sAND\s', ' & ', 'Baked Beans And Spam', flags=re.IGNORECASE)
# 'Baked Beans & Spam'

Шаблон pattern может быть строкой или объектом шаблона.

Необязательный аргумент count - это максимальное число вхождений pattern, подлежащих замене. count должен быть неотрицательным целым числом. Если этот параметр опущен или равен нулю, то произойдет замена всех вхождений. Пустые совпадения для pattern заменяются только тогда, когда они не соседствуют с предыдущим пустым совпадением, поэтому sub('x*', '-', 'abxd') возвращает '-a-b--d-'.

Если аргумент repl - это строка, то в дополнение к описанным выше экранированию символов и обратным ссылкам, выражение \g<name> будет использовать подстроку, соответствующую группе с именем name, как определено синтаксисом (?P<name>...). Ссылка на именованную группу \g<number> использует соответствующий номер группы \g<2>, следовательно эквивалентно обратной ссылке \2, но не является двусмысленным в замене, такой как \g<2>0. Обратная ссылка \20 будет интерпретироваться как ссылка на группу 20, а не ссылка на группу 2, за которой следует буквальный символ '0'. Ссылка \g<0> заменяет всю подстроку, соответствующую регулярному выражению.

Устарело, начиная с Python 3.11: идентификатор группы, содержащий все, кроме цифр ASCII. Имена групп, содержащие символы, отличные от ASCII, в строках замены байтов.

Пример использования re.sub():

В примере демонстрируется использование re.sub() с функцией "разброса" текста или рандомизации порядка всех символов в каждом слове предложения, кроме первого и последнего символов:

def repl(m):
    inner_word = list(m.group(2))
    random.shuffle(inner_word)
    return m.group(1) + "".join(inner_word) + m.group(3)

>>> import re
>>> text = "Professor Abdolmalek, please report your absences promptly."
>>> re.sub(r"(\w)(\w+)(\w)", repl, text)
# 'Poefsrosr Aealmlobdk, pslaee reorpt your abnseces plmrptoy.'

>>> re.sub(r"(\w)(\w+)(\w)", repl, text)
# 'Pofsroser Aodlambelk, plasee reoprt yuor asnebces potlmrpy.'