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

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

Другая распространенная задача - найти все совпадения для шаблона и заменить их другой строкой. Метод Pattern.sub() принимает значение замены, которое может быть либо строкой, либо функцией или строкой подлежащей обработке.

Pattern.sub(replacement, string[, count=0])

Возвращает строку, полученную путем замены левого непересекающегося вхождения регулярного выражения в строку. Если шаблон не найден, строка возвращается без изменений.

Необязательный аргумент count - это максимальное число вхождений Pattern (скомпилированного шаблона регулярного выражения для поиска) подлежащих замене. Аргумент count должен быть неотрицательным целым числом. Значение по умолчанию 0 означает замену всех вхождений.

Вот простой пример использования метода .sub(). Он заменяет названия цветов словом color:

>>> p = re.compile('(blue|white|red)')
>>> p.sub('colour', 'blue socks and red shoes')
# 'colour socks and colour shoes'
>>> p.sub('colour', 'blue socks and red shoes', count=1)
# 'colour socks and red shoes'

Метод Pattern.subn() делает ту же работу, но возвращает двойной кортеж, содержащий новое значение строки и число замен, которые были выполнены:

>>> p = re.compile('(blue|white|red)')
>>> p.subn('colour', 'blue socks and red shoes')
# ('colour socks and colour shoes', 2)
>>> p.subn('colour', 'no colours at all')
# ('no colours at all', 0)

Пустые совпадения заменяются только тогда, когда они не соседствуют с предыдущим совпадением.

>>> p = re.compile('x*')
>>> p.sub('-', 'abxd')
# '-a-b-d-'

Если replacement является строкой, то все экранированные обратные слеши в ней обрабатываются. То есть \n преобразуется в один символ новой строки, \r преобразуется в возврат каретки и т. д. Неизвестные последовательности символов, такие как \& остаются как есть. Обратные ссылки, такие как \6, заменяются подстрокой, соответствующей группе в шаблоне. Это позволяет включать части исходного текста в результирующую строку замены.

Этот пример соответствует слову section, за которым следует строка, заключенная в {, }, и изменяет раздел на подраздел:

>>> p = re.compile('section{ ( [^}]* ) }', re.VERBOSE)
>>> p.sub(r'subsection{\1}', 'section{First} section{second}')
# 'subsection{First} subsection{second}'

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

>>> p = re.compile('section{ (?P<name> [^}]* ) }', re.VERBOSE)
>>> p.sub(r'subsection{\1}', 'section{First}')
# 'subsection{First}'
>>> p.sub(r'subsection{\g<1>}', 'section{First}')
# 'subsection{First}'
>>> p.sub(r'subsection{\g<name>}', 'section{First}')
# 'subsection{First}'

Аргумент replacement в обсуждаемых методах также может быть функцией, которая дает еще больше контроля. Если replacement является функцией, то функция вызывается для каждого неперекрывающегося вхождения шаблона регулярного выражения. При каждом вызове функции передается аргумент объекта match для сопоставления и эта информация может использоваться для вычисления желаемой строки замены, которую должна вернуть эта функция.

В следующем примере функция замены преобразует десятичные числа в шестнадцатеричные:

def hexrepl(match):
    "Return the hex string for a decimal number"
    value = int(match.group())
    return hex(value)

>>> p = re.compile(r'\d+')
>>> p.sub(hexrepl, 'Call 65490 for printing, 49152 for user code.')
# 'Call 0xffd2 for printing, 0xc000 for user code.'

При использовании функции re.sub() модуля re шаблон регулярного выражения передается в качестве первого аргумента. Шаблон может быть предоставлен в виде объекта или строки; Если вам нужно указать флаги регулярного выражения, вы должны либо использовать объект шаблона в качестве первого параметра, либо использовать встроенные модификаторы в строке шаблона, такие как (?i), например sub('(?i)b+', 'x', 'bbbb BBBB') возвращает 'x x'.