- Замены с помощью регулярных выражений
- Использование групп при заменах
- Именованные группы
- Python regex: How to search and replace strings
- Table of contents
- Python regex replace
- Regex to search and replace
- Syntax:
- Input:
- Output:
- Replacing multiple patterns using regex
- Syntax:
- Input:
- Output:
- Replacing multiple patterns with multiple replacements using regex
- Input:
- Output:
- Closing thoughts
Замены с помощью регулярных выражений
В стандартных строках 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 = '9+' >>> print(re.sub(pattern, 'NUM', string)) Мой дядя родился в NUM году и в NUM ему было NUM
Пример с Алёной и заглавной и строчной буквой ё нельзя запрограммировать одной регуляркой. Подумайте, как можно сделать такую функцию, используя регулярки.
Использование групп при заменах
Представьте, что вам нужно написать функцию, которая будет менять американский формат записи даты MM/DD/YYYY на русский DD.MM.YYYY . Сейчас не будем говорить, про то, что дни могут быть только в диапазоне от 1 до 31, а месяцы от 1 до 12.
Функция может иметь слудующий вид:
def convert_dates(text): pattern = '(4)/(3)/(4)' 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 = '(4)/(1)/(7)' 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 = '(?P9)/(?P2)/(?P7) (?P9:7)' repl = r'\g/\g/\g в \g' return re.sub(pattern, repl, text)
>>> convert_dates('Я влюбился в тебя 03/21/2017 23:45 по московскому времени') 'Я влюбился в тебя 21/03/2017 в 23:45 по московскому времени'
(?P3) — ?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'
Python regex: How to search and replace strings
In this tutorial, you will learn about how to use regex (or regular expression) to do a search and replace operations on strings in Python.
Regex can be used to perform various tasks in Python. It is used to do a search and replace operations, replace patterns in text, check if a string contains the specific pattern. But today we will learn about performing search and replace operations using regex.
Table of contents
Python regex replace
Python has a built-in module called re, which helps in searching and replacing. In order to use re, we need to import the module at the beginning of our code.
Now we’ll learn about the search and replace operation using regex.
Regex to search and replace
The regex method searches a string and then replace it with some other value. Python re.sub() function in the re module is used to do so.
Syntax:
re.sub(pattern, replacement, string, count=0, flags=0)
First of all, let us understand what all these parameters mean:
pattern: The regular expression you want to search and find inside the given string in Python.
string: The variable that contains the given string on which you want to perform the operation.
count: If the pattern occurs multiple times in the string, the number of times you want to you want it to be replaced. The default value is 0. It is optional.
flags: The regex flags are optional.
Input:
Output:
Replacing multiple patterns using regex
We can use regex to replace multiple patterns at one time using regex. This can be easily done using the following syntax.
Syntax:
re.sub(pattern_1 | pattern_2, replacement, string, count=0, flags=0)
Input:
import re str = "Joe-Kim Ema Max Aby Liza" print(re.sub("(\s) | (-)", ", ", str))
Output:
Replacing multiple patterns with multiple replacements using regex
Now, if ever, you want to replace multiple patterns but with different replacements then also regex can be used. It can be done with a minor modification which you can see in the following example.
Input:
import re def convert_case(match_obj): if match_obj.group(1) is not None: return match_obj.group(1).lower() if match_obj.group(2) is not None: return match_obj.group(2).upper() str = "jOE kIM mAx ABY lIzA" print(re.sub(r"([A-Z]+) | ([a-z]+)", convert_case, str))
In this example, the string contains Uppercase and lowercase that we need to replace. We need to replace the uppercase with the lowercase and vice versa.
In order to do that, we will make two groups and then add a function for the replacement.
Output:
Closing thoughts
To replace a string in Python, the regex sub() method is used. It is a built-in Python method in re module that returns replaced string. Don’t forget to import the re module. This method searches the pattern in the string and then replace it with a new given expression. One can learn about more Python concepts here.