Освоение регулярных выражений в Python
Регулярные выражения (regex или regexp) — мощные инструменты для поиска шаблонов в строках. Модуль re
в Python предоставляет всеобъемлющий интерфейс для работы с ними, позволяя выполнять сложные манипуляции с текстом и извлечение данных. Это руководство проведет вас через основные функции и концепции, предоставив вам возможность эффективно использовать возможности регулярных выражений в ваших проектах Python.
Оглавление
re.match()
: Сопоставление с начала строкиre.search()
: Поиск первого совпаденияre.compile()
: Оптимизация производительности- Флаги: изменение поведения сопоставления
- Наборы символов: определение допустимых символов
- Поиск и замена с помощью
re.sub()
re.findall()
: Извлечение всех совпаденийre.finditer()
: Итерация по совпадениямre.split()
: Разбиение строк по шаблону- Основные шаблоны: якоря, классы символов
- Повторение: квантификаторы и жадное/нежадное сопоставление
- Специальные последовательности: цифры, пробельные символы, символы слова
re.escape()
: Обработка специальных символов- Группы захвата и метод
group()
1. re.match()
: Сопоставление с начала строки
Функция re.match()
пытается сопоставить шаблон только в самом начале строки. Она возвращает объект совпадения, если сопоставление успешно, в противном случае — None
.
import re
text = "Hello World"
pattern = "Hello"
match = re.match(pattern, text)
if match:
print("Найдено совпадение:", match.group(0))
else:
print("Совпадений не найдено")
2. re.search()
: Поиск первого совпадения
re.search()
просматривает всю строку на наличие первого вхождения шаблона. В отличие от re.match()
, он не требует, чтобы совпадение находилось в начале.
import re
text = "Hello World"
pattern = "World"
match = re.search(pattern, text)
if match:
print("Найдено совпадение:", match.group(0))
else:
print("Совпадений не найдено")
3. re.compile()
: Оптимизация производительности
Для повышения производительности, особенно при многократном использовании одного и того же шаблона, скомпилируйте его с помощью re.compile()
. Это создает многократно используемый объект шаблона.
import re
compiled_pattern = re.compile(r"d+") # Компиляция шаблона
text1 = "There are 123 apples"
text2 = "And 456 oranges"
match1 = compiled_pattern.search(text1)
match2 = compiled_pattern.search(text2)
print(match1.group(0)) # Вывод: 123
print(match2.group(0)) # Вывод: 456
4. Флаги: изменение поведения сопоставления
Флаги изменяют процесс сопоставления. re.IGNORECASE
выполняет сопоставление без учета регистра, а re.MULTILINE
рассматривает каждую строку как отдельную строку для якорей ^
и $
.
import re
text = "Hello world"
pattern = re.compile("hello", re.IGNORECASE)
match = pattern.search(text)
print(match.group(0)) # Вывод: Hello
5. Наборы символов: определение допустимых символов
Наборы символов ([]
) указывают допустимые символы. Например, [a-z]
соответствует строчным буквам.
import re
text = "abc123XYZ"
pattern = re.compile("[a-z]+")
match = pattern.search(text)
print(match.group(0)) # Вывод: abc
6. Поиск и замена с помощью re.sub()
re.sub()
заменяет вхождения шаблона на строку замены.
import re
text = "Hello World"
new_text = re.sub("World", "Python", text)
print(new_text) # Вывод: Hello Python
7. re.findall()
: Извлечение всех совпадений
re.findall()
возвращает список всех непересекающихся совпадений.
import re
text = "123 abc 456 def"
numbers = re.findall(r"d+", text)
print(numbers) # Вывод: ['123', '456']
8. re.finditer()
: Итерация по совпадениям
re.finditer()
возвращает итератор, который дает объекты совпадений. Более эффективное использование памяти для большого количества совпадений в больших строках.
import re
text = "123 abc 456 def"
for match in re.finditer(r"d+", text):
print(match.group(0)) # Вывод: 123, 456 (на отдельных строках)
9. re.split()
: Разбиение строк по шаблону
re.split()
разделяет строку на основе шаблона.
import re
text = "apple,banana,cherry"
fruits = re.split(r",", text)
print(fruits) # Вывод: ['apple', 'banana', 'cherry']
10. Основные шаблоны: якоря, классы символов
.
: Соответствует любому символу, кроме символа новой строки.^
: Соответствует началу строки.$
: Соответствует концу строки.[]
: Соответствует набору символов (например,[abc]
,[a-z]
).[^...]
: Соответствует любому символу, *не* входящему в набор (инвертированный набор символов).
11. Повторение: квантификаторы и жадное/нежадное сопоставление
*
: Ноль или более вхождений.+
: Одно или более вхождений.?
: Ноль или одно вхождение.{m}
: Ровноm
вхождений.{m,n}
: Отm
доn
вхождений.*?
,+?
,??
,{m,n}?
: Нежадные версии (соответствуют кратчайшей возможной строке).
12. Специальные последовательности: цифры, пробельные символы, символы слова
d
: Соответствует любой цифре (0-9).D
: Соответствует любому символу, не являющемуся цифрой.s
: Соответствует любому пробельному символу (пробел, табуляция, символ новой строки).S
: Соответствует любому символу, не являющемуся пробельным.w
: Соответствует любому буквенно-цифровому символу (буквы, цифры, подчеркивание).W
: Соответствует любому символу, не являющемуся буквенно-цифровым.
13. re.escape()
: Обработка специальных символов
re.escape()
экранирует специальные символы в строке, позволяя использовать её как литеральный шаблон без непреднамеренных интерпретаций regex.
14. Группы захвата и метод group()
Скобки ()
создают группы захвата. Метод group()
обращается к захваченным подстрокам.
import re
text = "My phone number is 123-456-7890"
match = re.search(r"(d{3})-(d{3})-(d{4})", text)
if match:
area_code = match.group(1)
prefix = match.group(2)
line_number = match.group(3)
print(f"Код региона: {area_code}, Префикс: {prefix}, Номер линии: {line_number}")
Это руководство дает прочную основу по работе с модулем re
в Python. Дальнейшее изучение расширенных методов значительно улучшит ваши возможности обработки строк. Не забудьте обратиться к официальной документации Python для получения полной справки.