Python regex replace group

Замены с помощью регулярных выражений

В стандартных строках Python есть функция .replace(old, new) , которую можно успешно использовать для замены одной строки на другую:

>>> string = 'Алёна мыла ёлку!' >>> print(string.replace('ё', 'е')) Алена мыла елку! 

Но, что, делать в более сложных случаях? Ну не писать же несколько раз вызов функции .replace() с разными аргументами

>>> string = 'Ёлку мыла Алёна. ' >>> print(string.replace('ё', 'е').replace('Ё', 'Е')) Елку мыла Алена. 

На помощь приходят регулярные выражения и модуль re со своей функцией re.sub() .

Сигнатура методы такая: re.sub(pattern, repl, string) , где

  • pattern — это регулярное выражение — шаблон для поиска строки, которую нужно заменить
  • repl — строка, на которую нужно произвести замену
  • string — сама строка, над которой нужно произвести манипуляции

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

>>> # Задача: заменить все числа на слово NUM >>> # >>> import re >>> string = 'Мой дядя родился в 48 году и в 2000 ему было 52' >>> pattern = '8+' >>> print(re.sub(pattern, 'NUM', string)) Мой дядя родился в NUM году и в NUM ему было NUM 

Пример с Алёной и заглавной и строчной буквой ё нельзя запрограммировать одной регуляркой. Подумайте, как можно сделать такую функцию, используя регулярки.

Использование групп при заменах

Представьте, что вам нужно написать функцию, которая будет менять американский формат записи даты MM/DD/YYYY на русский DD.MM.YYYY . Сейчас не будем говорить, про то, что дни могут быть только в диапазоне от 1 до 31, а месяцы от 1 до 12.

Читайте также:  Css style element with children

Функция может иметь слудующий вид:

def convert_dates(text): pattern = '(3)/(9)/(1)' result = re.search(pattern, text) if result: mm = result.group(1) dd = result.group(2) yyyy = result.group(3) new_date = dd + '/' + mm + '/' + yyyy start, stop = result.span() text = text[:start] + new_date + text[stop:] return text 
>>> convert_dates('Я влюбился в тебя 03/21/2017.') 'Я влюбился в тебя 21/03/2017.' 

Но, что если, дат в тексте будет больше, чем одна. Да и вообще, неужели нужно писать столь сложный код для такой логики?

На помощь приходят группы. Функцию выше можно переписать так:

def convert_dates(text): pattern = '(6)/(7)/(8)' repl = r'\2/\1/\3' return re.sub(pattern, repl, text) 
>>> convert_dates('Я влюбился в тебя 03/21/2017. Мои родители познакомились 03/21/1999') 'Я влюбился в тебя 21/03/2017. Мои родители познакомились 21/03/1999' 

Здесь repl — это еще один шаблон, который говорит функции re.sub() куда вставить ту или иную группы из шаблона pattern . Выглядит конечно страшно, но куда деваться.

Как, наверное, можно догадаться, \N — это указание на конкретную группу из шаблона pattern , которую нужно подставить. N — это номер группы.

Именованные группы

Когда количество групп в шаблонах увеличивается, то становится трудно с ними работать. Можно легко запутаться в индексах и допустить ошибку. Здесь на помощь приходят именованные группы, с помощью которых можно дать каждой группе своё имя. Осталось только привыкнуть к синтаксису.

Что, если, в наш пример с датой добавится еще и время…

def convert_dates(text): pattern = '(?P7)/(?P2)/(?P7) (?P6:3)' repl = r'\g/\g/\g в \g' return re.sub(pattern, repl, text) 
>>> convert_dates('Я влюбился в тебя 03/21/2017 23:45 по московскому времени') 'Я влюбился в тебя 21/03/2017 в 23:45 по московскому времени' 

(?P4) — ?P — специальный синтаксис задания имени группы. Имя здесь только то, что заключено в скобки.

Обращение к группе происходит тоже с помощью спецального синтаксиса: \g

Имена групп можно использовать в методе .group()

def get_mail_provider(email): pattern = '(?P[a-zA-Z0-9_]+)@(?P(?P[a-zA-Z0-9_]+)\.(?P[a-zA-Z]+))' result = re.search(pattern, email) if result: return result.group('provider') return None 
>>> get_mail_provider('ivan@yandex.ru') 'yandex.ru' 

Источник

How to Replace Group using Regex Replace in Python

To replace a group using a regex in Python, use the “re.sub()” method and include the group you want to replace in the regular expression.

Syntax

The syntax of the sub() method is re.sub(pattern, repl, string, count=0, flags=0).

  1. pattern: It is the regex pattern for the group to be replaced.
  2. replay: It is the replacement string.
  3. string: It is the string in which the replacement will be performed.
  4. count: It is the maximum number of replacements to make.
  5. flags: They are the regex flags to use.

The syntax consists of various metacharacters to indicate the pattern you are looking for.

Python regex replace approach replaces a group of characters with a new string in the text. It can find a specific word or phrase and replace it with a different one.

For example, the metacharacter ‘\d’ indicates that you want to find digits, or ‘\s’ suggests that you want to find whitespace.

Example 1

To use the re.sub() method in Python, import the built-in re module.

import re str = "you are the world, you are the children!" result = re.sub(r"you", "we", str) print(result)
we are the world, we are the children!

In this example, we replaced a group of strings “you” with “we” using the re.sub() method.

Example 2

Replace each substring of the string with a provided string using the re.sub() method.

import re str = "you are the world, you are the children!" output_value = re.sub(r"(\w+)", r"kb", str) print(output_value)

We replaced each substring of a string with a provided string using the re.sub() method in one go.

Leave a Comment Cancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Источник

Оцените статью