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.'