Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Python

Регулярные выражения в Python (модуль re) — практическое руководство

Регулярные выражения в Python (модуль re) — практическое руководство

Узнайте, как использовать силу регулярных выражений в Python с модулем re. Пошаговые примеры иллюстрируют распространённые паттерны, техники сопоставления и продвинутые функции.

Что такое регулярное выражение?

Регулярное выражение (RegEx) — это последовательность символов, определяющая шаблон поиска. Например, паттерн ^a...s$ соответствует любой пятисимвольной строке, начинающейся с a и заканчивающейся s.

^a...s$

Паттерны можно сопоставлять со строками. Таблица ниже демонстрирует поведение паттерна с разными входами:

ВыражениеСтрокаСовпало?
^a...s$absНет совпадения
aliasСовпало
abyssСовпало
AliasНет совпадения
An abacusНет совпадения

Модуль re Python предоставляет инструменты для работы с RegEx. Быстрый пример, использующий re.match() для проверки паттерна против строки:

import re
pattern = '^a...s$'
test_string = 'abyss'
result = re.match(pattern, test_string)
if result:
    print("Search successful.")
else:
    print("Search unsuccessful.")

Когда паттерн найден, re.match() возвращает объект совпадения; иначе — None.


Задание паттернов с метасимволами

Метасимволы — специальные символы, которые движок regex интерпретирует особым образом. Ниже — краткий справочник самых распространённых метасимволов:

[] . ^ $ * + ? {} () \ |


Квадратные скобки: []

Квадратные скобки задают набор символов для сопоставления. Например, [abc] соответствует любому одиночному вхождению a, b или c.

ВыражениеСтрокаСовпало?
[abc]a1 совпадение
ac2 совпадения
Hey JudeНет совпадения
abc de ca5 совпадений

Диапазоны выражаются дефисом, например [a-e] равно [abcde]. Для инверсии набора поставьте каретку ^ после открывающей скобки, например [^abc] соответствует любому символу, кроме a, b, c.


Точка: .

Точка соответствует любому одиночному символу, кроме новой строки.

ВыражениеСтрокаСовпало?
..aНет совпадения
ac1 совпадение
acd1 совпадение
acde2 совпадения (содержит 4 символа)

Каретка: ^ и Доллар: $

Каретка утверждает начало строки; доллар — конец. Например, ^a соответствует любой строке, начинающейся с a, а a$ — любой строке, заканчивающейся a.

ВыражениеСтрокаСовпало?
^aa1 совпадение
abc1 совпадение
bacНет совпадения
^ababc1 совпадение
acbНет совпадения (начинается с a, но не следует b)
ВыражениеСтрокаСовпало?
a$a1 совпадение
formula1 совпадение
cabНет совпадения

Квантификаторы: *, +, ?, {n,m}

Эти символы контролируют, сколько раз предшествующий элемент должен появляться.

Примеры:

ВыражениеСтрокаСовпало?
ma*nmn1 совпадение
man1 совпадение
maaan1 совпадение
mainНет совпадения (a не следует n)
woman1 совпадение
ВыражениеСтрокаСовпало?
ma+nmnНет совпадения (нет a)
man1 совпадение
maaan1 совпадение
mainНет совпадения (a не следует n)
woman1 совпадение
ВыражениеСтрокаСовпало?
ma?nmn1 совпадение
man1 совпадение
maaanНет совпадения (более одного a)
mainНет совпадения (a не следует n)
woman1 совпадение
ВыражениеСтрокаСовпало?
a{2,3}abc datНет совпадения
abc daat1 совпадение (в daat)
aabc daaat2 совпадения (в aabc и daaat)
aabc daaaat2 совпадения (в aabc и daaaat)

Часто используемый паттерн: [0-9]{2,4} соответствует двум до четырёх последовательным цифрам.

ВыражениеСтрокаСовпало?
[0-9]{2,4}ab123csde1 совпадение (в ab123csde)
12 and 3456733 совпадения (12, 3456, 73)
1 and 2Нет совпадения

Альтернация: |

Вертикальная черта реализует логическое ИЛИ. Например, a|b соответствует любой строке, содержащей a или b.

ВыражениеСтрокаСовпало?
a|bcdeНет совпадения
ade1 совпадение (в ade)
acdbea3 совпадения (в acdbea)

Группировка: ()

Скобки группируют подпаттерны и захватывают совпавшие подстроки. Пример: (a|b|c)xz соответствует любой строке, содержащей a, b или c, за которыми следует xz.

ВыражениеСтрокаСовпало?
(a|b|c)xzab xzНет совпадения
abxz1 совпадение (в abxz)
axz cabxz2 совпадения (в axzbc cabxz)

Экранирование: \

Используйте обратный слэш для обращения с метасимволом как с буквальным. Например, \$a соответствует буквальной последовательности $a, а не интерпретирует $ как якорь конца строки.


Специальные последовательности

Специальные последовательности упрощают распространённые паттерны. Ниже — справочный список с иллюстративными примерами.

Начало строки: \A

ВыражениеСтрокаСовпало?
\Athethe sunСовпало
In the sunНет совпадения

Граница слова: \b

ВыражениеСтрокаСовпало?
\bfoofootballСовпало
a footballСовпало
afootballНет совпадения
foo\bthe fooСовпало
the afoo testСовпало
the afootestНет совпадения

Не граница слова: \B

ВыражениеСтрокаСовпало?
\BfoofootballНет совпадения
a footballНет совпадения
afootballСовпало
foo\Bthe fooНет совпадения
the afoo testНет совпадения
the afootestСовпало

Цифра: \d / Не цифра: \D

ВыражениеСтрокаСовпало?
\d12abc33 совпадения (в 12abc3)
PythonНет совпадения
\D1ab34"503 совпадения (в 1ab34"50)
1345Нет совпадения

Пробельный символ: \s / Не пробельный: \S

ВыражениеСтрокаСовпало?
\sPython RegEx1 совпадение
PythonRegExНет совпадения
\Sa b2 совпадения (в a b)
Нет совпадения

Символ слова: \w / Не слово: \W

ВыражениеСтрокаСовпало?
\w12&": ;c 3 совпадения (в 12": ;c)
"%> !Нет совпадения
\W1a2%c1 совпадение (в 1a2%c)
PythonНет совпадения

Конец строки: \Z

ВыражениеСтрокаСовпало?
Python\ZI like Python1 совпадение
I like Python ProgrammingНет совпадения
Python is fun.Нет совпадения

Совет: Используйте онлайн-тестер regex вроде regex101 для быстрого создания и отладки паттернов.


Использование RegEx в Python

Модуль re Python предлагает богатый набор функций и констант для операций с regex. Импортируйте его:

import re

Ниже — самые распространённые утилиты и как их применять.


re.findall()

Возвращает список всех непересекающихся совпадений в строке.

# Извлечение всех чисел из строки
import re
string = 'hello 12 hi 89. Howdy 34'
pattern = '\d+'
result = re.findall(pattern, string)
print(result)  # Вывод: ['12', '89', '34']

Когда совпадений нет, возвращается пустой список.


re.split()

Разбивает строку в каждой точке, где паттерн совпадает, возвращая список подстрок.

import re
string = 'Twelve:12 Eighty nine:89.'
pattern = '\d+'
result = re.split(pattern, string)
print(result)  # Вывод: ['Twelve:', ' Eighty nine:', '.']

Используйте опциональный аргумент maxsplit для ограничения числа разбиений. Значение 0 (по умолчанию) разбивает при каждом совпадении.

import re
string = 'Twelve:12 Eighty nine:89 Nine:9.'
pattern = '\d+'
# Разбить только при первом вхождении
result = re.split(pattern, string, 1)
print(result)  # Вывод: ['Twelve:', ' Eighty nine:89 Nine:9.']

re.sub()

Заменяет все вхождения паттерна на строку замены.

# Удаление всех пробельных символов
import re
string = 'abc 12\nde 23 \n f45 6'
pattern = '\s+'
replace = ''
new_string = re.sub(pattern, replace, string)
print(new_string)  # Вывод: abc12de23f456

Для ограничения замен предоставьте аргумент count. Значение 0 заменяет каждое совпадение.

new_string = re.sub(r'\s+', replace, string, 1)
print(new_string)  # Вывод:
# abc12de 23
#  f45 6

re.subn()

Как re.sub(), но возвращает кортеж, содержащий новую строку и число выполненных замен.

new_string = re.subn(pattern, replace, string)
print(new_string)  # Вывод: ('abc12de23f456', 4)

re.search()

Находит первое место, где паттерн совпадает.

string = "Python is fun"
match = re.search('\\APython', string)
if match:
    print("pattern found inside the string")
else:
    print("pattern not found")
# Вывод: pattern found inside the string

Объект совпадения (Match Object)

При обнаружении совпадения re.search() возвращает объект Match. Распространённые методы и атрибуты:

string = '39801 356, 2102 1111'
pattern = '(\\d{3}) (\\d{2})'
match = re.search(pattern, string)
if match:
    print(match.group())
    print(match.group(1))
    print(match.group(2))
    print(match.groups())
    print(match.start(), match.end(), match.span())
else:
    print("pattern not found")
# Вывод:
# 801 35
# 801
# 35
# ('801', '35')
# 2 8 (2, 8)

Использование сырых строк (префикс r)

Префиксация строкового литерала r трактует обратные слэши как буквальные символы, предотвращая случайные escape-последовательности. Это особенно полезно в regex-паттернах.

string = '\n and \r are escape sequences.'
result = re.findall(r'[\n\r]', string)
print(result)  # Вывод: ['\n', '\r']

Для глубокого изучения модуля re обратитесь к официальной документации Python.

Python

  1. Ключевые слова и идентификаторы в Python: мастерство зарезервированных слов и соглашений об именовании
  2. Освоение типов данных в Python: практическое руководство
  3. Мастерство операторов Python: Полное руководство
  4. Аргументы функций в Python: позиционные, именованные и параметры по умолчанию
  5. Словари в Python: создание, манипуляции и продвинутые техники
  6. Итераторы в Python: как они работают и как создать свои
  7. Замыкания в Python: как вложенные функции захватывают переменные
  8. Модуль datetime в Python: практическое руководство по датам, времени и часовым поясам
  9. Освоение модуля time в Python: функции, структуры и практические примеры
  10. Освоение Python time.sleep(): лучшие практики, многопоточность и реальные примеры