Регулярные выражения в 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 на боковой панели.