Обратные ссылки регулярных выражений в Python
Обратные ссылки похожи на переменные в Python.
- Введение в обратные ссылки на регулярные выражения Python
- Примеры обратных ссылок на регулярные выражения Python
- 1) Использование обратных ссылок для получения текста внутри кавычек
- 2) Поиск слов, которые имеют хотя бы один последовательный повторяющийся символ
Введение в обратные ссылки на регулярные выражения Python
Обратные ссылки позволяют ссылаться на группы захвата в регулярном выражении в Python.
Ниже показан синтаксис обратной ссылки:
\N
Альтернативно вы можете использовать следующий синтаксис:
\g<N>
В этом синтаксисе N может быть 1, 2, 3 и т. д., что представляет соответствующую группу захвата.
Обратите внимание, что \g<0> относится ко всему совпадению, которое имеет то же значение, что и match.group(0).
Предположим, у вас есть строка с повторяющимся словом Python, например:
s = 'Python Python is awesome'
И вы хотите удалить повторяющееся слово (Python), чтобы результирующая строка была такой:
Python is awesome
Для этого вы можете использовать регулярное выражение с обратной ссылкой.
- Сначала сопоставьте слово с одним или несколькими символами и одним или несколькими пробелами:
'\w+\s+'
- Во-вторых, создайте группу захвата, содержащую только символы слова:
'(\w+)\s+'
- В-третьих, создайте обратную ссылку, которая ссылается на первую группу захвата:
'(\w+)\s+\1'
В этом шаблоне \1 — это обратная ссылка, которая ссылается на группу захвата(\w+).
- Наконец, замените все совпадение первой группой захвата, используя функцию sub() из модуля re:
import re s = 'Python Python is awesome' new_s = re.sub(r'(\w+)\s+\1', r'\1', s) print(new_s)
Выход:
Python is awesome
Примеры обратных ссылок на регулярные выражения Python
Давайте рассмотрим несколько примеров использования обратных ссылок.
1) Использование обратных ссылок для получения текста внутри кавычек
Предположим, вы хотите получить текст в двойных кавычках:
"This is regex backreference example"
Или в одинарных кавычках:
'This is regex backreference example'
Но не подобную смесь одинарных и двойных кавычек:
'not match"
Для этого вы можете использовать следующий шаблон:
'[\'"](.*?)[\'"]'
Однако этот шаблон будет соответствовать тексту, который начинается с одинарной кавычки(‘) и заканчивается двойной кавычкой(«) или наоборот. Например:
import re s = '"Python\'s awsome". She said' pattern = '[\'"].*?[\'"]' match = re.search(pattern, s) print(match.group(0))
Он возвращает «Python’, а не «Python’s awesome»:
"Python'
Чтобы исправить это, вы можете использовать обратную ссылку:
r'([\'"]).*?\1'
Обратная ссылка \1 относится к первой группе захвата. Таким образом, если подгруппа начинается с одинарной кавычки, \1 будет соответствовать одинарной кавычке. И если подгруппа начинается с двойной кавычки, \1 будет соответствовать двойной кавычке.
Например:
import re s = '"Python\'s awsome". She said' pattern = r'([\'"])(.*?)\1' match = re.search(pattern, s) print(match.group())
Выход:
"Python's awsome"
2) Поиск слов, которые имеют хотя бы один последовательный повторяющийся символ
В следующем примере обратная ссылка используется для поиска слов, содержащих хотя бы один последовательный повторяющийся символ:
import re words = ['apple', 'orange', 'strawberry'] pattern = r'\b\w*(\w)\1\w*\b' results = [w for w in words if re.search(pattern, w)] print(results)
Выход:
['apple', 'strawberry']