Регулярные выражения в Python
Регулярные выражения позволяют нам находить содержимое внутри строк, соответствующих определенному формату.
Формулируя регулярное выражение со специальным синтаксисом, вы можете
- искать текст в строке
- заменить подстроки в строке
- извлекать информацию из строки
Модуль re
стандартной библиотеки Python предоставляет нам набор инструментов для работы с регулярными выражениями.
В частности, среди прочего, он предлагает нам следующие функции:
re.match()
проверяет совпадение в начале строкиre.search()
проверяет совпадение в любом месте строки
Оба принимают 3 параметра: шаблон, строку для поиска и флаги.
Прежде чем говорить о том, как их использовать, давайте познакомимся с основами шаблона регулярного выражения.
Шаблон представляет собой строку, заключенную в r''
. Внутри него мы можем использовать некоторые специальные комбинации символов, которые мы можем использовать для захвата желаемых значений.
Например:
.
соответствует одному символу (кроме символа новой строки)\w
соответствует любому буквенно-цифровому символу ([a-zA-Z0-9_]
)\W
соответствует любому не буквенно-цифровому символу\d
соответствует любой цифре\D
соответствует всему, что не является цифрой\s
соответствует пробелу\S
соответствует всему, что не является пробелом
Квадратные скобки могут содержать совпадение нескольких символов: [\d\sa]
соответствует цифрам и пробелам, а также символу a
. [a-z]
соответствует символам от a
до z
.
\
может использоваться для экранирования, например, для соответствия точке .
, которую вы должны использовать в своем шаблоне подобным образом \.
.
|
означает или
Также у нас есть якоря:
^
соответствует началу строки$
соответствует концу строки
Затем у нас есть модификаторы количества:
?
означает «ноль или один» вхождений*
означает «ноль или более» вхождений+
означает «одно или несколько» вхождений{n}
означает «точноn
» вхождений{n,}
означает «не менееn
» вхождений{n, m}
означает «минимумn
и максимумm
»
Скобки (<expression>)
, создают группу. Группы интересны, потому что мы можем фиксировать содержание группы.
Эти 2 примера соответствуют всей строке:
re.match('^.*Roger', 'My dog name is Roger')
re.match('.*', 'My dog name is Roger')
Вывод одного из этих операторов приведет к появлению такой строки:
<re.Match object; span=(0, 20), match='My dog name is Roger'>
Если вы присвоите результат переменной result
и вызовете group()
, вы увидите совпадение:
result = re.match('^.*Roger', 'My dog name is Roger')
print(result.group())
# My dog name is Roger
Давайте попробуем узнать кличку собаки. Если вы не знаете, как будет называться собака, вы можете найти «name is» и затем добавить группу, например:
result = re.search('name is (.*)', 'My dog name is Roger')
result.group()
напечатает «name is Roger» и result.group(1)
напечатает содержимое группы «Roger»:
print(result.group()) # name is Roger
print(result.group(1)) # Roger
Я уже упоминал, что re.search()
и re.match()
принимают флаги в качестве 3-го параметра. У нас есть несколько возможных флагов, наиболее часто используемый - re.I
должен выполнить сопоставление без учета регистра.
Это всего лишь введение в регулярные выражения, начиная с этого, вы можете попасть в множество кроличьих нор.
Я рекомендую попробовать ваши регулярные выражения на https://regex101.com для правильности. Убедитесь, что вы выбрали вариант Python на боковой панели.