"Как использовать регулярное выражение Python с "\1" для обращения к захваченным группам?"
Подскажите, пожалуйста, что означает "\1" в следующем регулярном выражении на Python?
re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
Меня интересует, как работает данный код и какой результат он вернёт. Заранее спасибо!
3 ответ(ов)
В вашем примере \1
является обратной ссылкой. Она соответствует тому, что было найдено в скобках, в данном случае — the
.
Вы по сути говорите следующее:
- сопоставьте пустую строку в начале слова (
\b
); - сопоставьте буквенные символы от a до z, один или более раз;
- снова сопоставьте термин из скобок.
Пример использования: cat in *(' ''the')' the'* hat
. В этом выражении вы ищете такое слово, которое начинается с the
и может иметь перед ним любой набор букв.
Пример
Следующий код использует регулярные выражения в Python для поиска повторяющихся цифр в заданной строке:
import re
result = re.search(r'(\d)\1{3}', '54222267890')
print(result.group())
Этот код выводит:
2222
В данном примере регулярное выражение r'(\d)\1{3}'
ищет последовательные повторяющиеся цифры. Символ \d
соответствует любой цифре, а \1
ссылается на первую захваченную группу (в данном случае — цифра, найденная в (\d)
). {3}
указывает, что эта цифра должна повторяться ровно три раза, что в итоге находит последовательность "2222" в строке "54222267890".
Для достижения вашей цели можно использовать регулярное выражение для поиска повторяющихся слов в строке. В вашем случае регулярное выражение r'(\b[a-z]+) \1'
ищет слово, за которым следует пробел и то же самое слово.
Вот как это можно сделать на Python с использованием модуля re
.
import re
# Исходная строка
text = 'cat in the the hat'
# Регулярное выражение для поиска повторяющихся слов
pattern = r'(\b[a-z]+) \1'
# Функция для проверки и замены
def replace_repeated_words(text, pattern):
matches = re.finditer(pattern, text)
results = []
for match in matches:
results.append((match.group(1), match.group(2) if match.lastindex >= 2 else None, 'Yes', match.group(1)))
# Возвращаем результаты
return results
# Получаем результаты
results = replace_repeated_words(text, pattern)
# Вывод структуры данных
print('| word | next-word | IsMatched() | replace with word |')
print('| --- | --- | --- | --- |')
for result in results:
print(f"| {result[0]} | {result[1]} | {result[2]} | {result[3]} |")
Здесь мы используем re.finditer
для нахождения всех совпадений в строке. В итоговой таблице указанное слово (word
), следующее слово (next-word
), флаг совпадения (IsMatched()
) и соответствующее слово для замены.
На выходе будет следующее:
| word | next-word | IsMatched() | replace with word |
| --- | --- | --- | --- |
| the | the | Yes | the |
Таким образом, ваше регулярное выражение успешно находит повторяющиеся слова, а затем выполняет нужные операции.
Фильтрация DataFrame pandas по критериям подстроки
Стоит ли использовать re.compile в Python?
Простой способ удалить несколько пробелов в строке?
Как сопоставить любой символ на нескольких строках в регулярном выражении?
Разделить строку по запятым, игнорируя запятые внутри двойных кавычек?