Понимание функций регулярных выражений Python с примерами

Понимание функций регулярных выражений Python с примерами Программирование и разработка

Регулярные выражения (регулярные выражения) — это специальные последовательности символов, используемые для поиска или сопоставления шаблонов в строках, как объясняется в этом введении в регулярные выражения. Ранее мы показали, как использовать регулярные выражения в JavaScript и PHP. В центре внимания этой статьи — регулярные выражения Python, цель которых — помочь вам лучше понять, как работать с регулярными выражениями в Python.

Вы узнаете, как эффективно использовать функции и методы регулярных выражений Python в своих программах, поскольку мы рассмотрим нюансы, связанные с обработкой объектов регулярных выражений Python.

Модули регулярных выражений в Python: re и regex

В Python есть два модуля — reи regex— которые облегчают работу с регулярными выражениями. Модуль reвстроен в Python, а сам regexмодуль был разработан Мэтью Барнеттом и доступен на PyPI. Модуль regexBarnett разработан с использованием встроенного reмодуля, и оба модуля имеют схожие функциональные возможности. Они различаются по реализации. Встроенный reмодуль является более популярным из двух, поэтому здесь мы будем работать с ним.

Встроенный модуль re Python

Чаще всего разработчики Python используют этот reмодуль при выполнении регулярных выражений. Общая конструкция синтаксиса регулярных выражений остается прежней (символы и символы), но модуль предоставляет некоторые функции и методы для эффективного выполнения регулярных выражений в программе Python.

Прежде чем мы сможем использовать reмодуль, мы должны импортировать его в наш файл, как и любой другой модуль или библиотеку Python:

import re

Это делает модуль доступным в текущем файле, чтобы функции и методы регулярных выражений Python были легко доступны. С помощью reмодуля мы можем создавать объекты регулярных выражений Python, манипулировать соответствующими объектами и применять флаги, где это необходимо.

Подборка функций

Модуль reимеет такие функции, как re.search(), re.match()и re.compile(), которые мы обсудим в первую очередь.

re.search(pattern, string, flags=0) vs re.match(pattern, string, flags=0)

И ищет в строке шаблон регулярного выражения Python и возвращает совпадение, если оно найдено или re.search()если объект совпадения не найден.re.match()None

Обе функции всегда возвращают первую совпадающую подстроку, найденную в заданной строке, и поддерживают значение по умолчанию 0для флага. Но пока search()функция просматривает всю строку, чтобы найти совпадение, match()ищет совпадение только в начале строки.

Просканируйте строку в поисках первого места, где шаблон регулярного выражения создает совпадение, и верните соответствующий объект совпадения. Возврат None, если ни одна позиция в строке не соответствует шаблону; обратите внимание, что это отличается от поиска совпадения нулевой длины в какой-либо точке строки.

Если ноль или более символов в начале строки соответствуют шаблону регулярного выражения, вернуть соответствующий объект соответствия. Возврат None, если строка не соответствует шаблону; обратите внимание, что это отличается от совпадения нулевой длины.

Давайте посмотрим на несколько примеров кода для дальнейшего пояснения:

search_result = [re.search](http://re.search)(r'\d{2}', 'I live at 22 Garden Road, East Legon')

print(search_result)

print(search_result.group())

>>>>

<re.Match object; span=(10, 12), match='22'>

22
match_result = re.match(r'\d{2}', 'I live at 22 Garden Road, East Legon')

print(match_result)

print(match_result.group())

>>>>

None

Traceback (most recent call last):

File "/home/ini/Dev./sitepoint/regex.py", line 4, in <module>

print(match_result.group())

AttributeError: 'NoneType' object has no attribute 'group'

Из приведенного выше примера Noneбыло возвращено, поскольку в начале строки не было совпадения. Возникло AttributeErrorпри group()вызове метода, потому что нет объекта соответствия:

match_result = re.match(r'\d{2}', "45 cars were used for the president's convoy")

print(match_result)

print(match_result.group())

>>>>

<re.Match object; span=(, 2), match='45'>

45

С 45, объектом соответствия в начале строки, match()метод работает просто отлично.

re.compile (шаблон, флаги = 0)

Функция compile()берет заданный шаблон регулярного выражения и компилирует его в объект регулярного выражения, используемый для поиска соответствия в строке или тексте. Он также принимает a flagв качестве необязательного второго аргумента. Этот метод полезен, потому что объект регулярного выражения можно присвоить переменной и использовать позже в нашем коде Python. Всегда не забывайте использовать необработанную строку r»…«при создании объекта регулярного выражения Python.

Вот пример того, как это работает:

regex_object = re.compile(r'b[ae]t')

mo = regex_object.search('I bet, you would not let a bat be your president')

print(regex_object)

>>>>

re.compile('b[ae]t')

re.fullmatch(pattern, string, flags=0)

Эта функция принимает два аргумента: строку, передаваемую как шаблон регулярного выражения, строку для поиска и необязательный аргумент флага. Объект соответствия возвращается, если вся строка соответствует заданному шаблону регулярного выражения. Если совпадений нет, возвращается None:

regex_object = re.compile(r'Tech is the future')

mo = regex_object.fullmatch('Tech is the future, join now')

print(mo)

print([mo.group](http://mo.group)())

>>>>

None

Traceback (most recent call last):

File "/home/ini/Dev./sitepoint/regex.py", line 16, in <module>

print([mo.group](http://mo.group)())

AttributeError: 'NoneType' object has no attribute 'group'

Код вызывает AttributeError, потому что нет совпадения строк.

Читайте также:  Pandas to Date

re.findall(pattern, string, flags=0)

Функция findall()возвращает список всех объектов соответствия, найденных в заданной строке. Он проходит по строке слева направо, пока не будут возвращены все совпадения. См. фрагмент кода ниже:

regex_object = re.compile(r'[A-Z]\w+')

mo = regex_object.findall('Pick out all the Words that Begin with a Capital letter')

print(mo)

>>>>

['Pick', 'Words', 'Begin', 'Capital']

В приведенном выше фрагменте кода регулярное выражение состоит из класса символов и символа слова, что гарантирует, что совпадающая подстрока начинается с заглавной буквы.

re.sub(pattern, repl, string, count=0, flags=0)

Части строки можно заменить другой подстрокой с помощью sub()функции. Он принимает как минимум три аргумента: шаблон поиска, строку замены и строку, над которой нужно работать. Исходная строка возвращается без изменений, если совпадений не найдено. Без передачи аргумента счетчика функция по умолчанию находит одно или несколько вхождений регулярного выражения и заменяет все совпадения.

Вот пример:

regex_object = re.compile(r'disagreed')

mo = regex_object.sub('agreed',"The founder and the CEO disagreed on the company's new direction, the investors disagreed too.")

print(mo)

>>>>

The founder and the CEO agreed on the company's new direction, the investors agreed too.

subn(pattern, repl, string, count=0, flags=0)

Функция subn()выполняет ту же операцию, что и sub(), но возвращает кортеж со строкой и номером произведенной замены. См. фрагмент кода ниже:

regex_object = re.compile(r'disagreed')

mo = regex_object.subn('agreed',"The founder and the CEO disagreed on the company's new direction, the investors disagreed too.")

print(mo)

>>>>

("The founder and the CEO agreed on the company's new direction, the investors agreed too.", 2)

Сопоставьте объекты и методы

Объект соответствия возвращается, когда шаблон регулярного выражения соответствует заданной строке в методе search()или объекта регулярного выражения. match()Объекты Match имеют несколько методов, которые оказываются полезными при работе с регулярными выражениями в Python.

Match.group([group1, …])

Этот метод возвращает одну или несколько подгрупп объекта соответствия. Один аргумент вернет подгруппу сигнала; несколько аргументов вернут несколько подгрупп на основе их индексов. По умолчанию group()метод возвращает всю подстроку совпадения. Когда аргумент в group()больше или меньше, чем в подгруппах, генерируется IndexErrorисключение.

Вот пример:

regex_object = re.compile(r'(\+\d{3}) (\d{2} \d{3} \d{4})')

mo = regex_object.search('Pick out the country code from the phone number: +233 54 502 9074')

print([mo.group](http://mo.group)(1))

>>>>

+233

Аргумент, 1переданный в group(1)метод, как видно из приведенного выше примера, выбирает код страны для Ганы +233. Вызов метода без аргумента или 0в качестве аргумента возвращает все подгруппы объекта соответствия:

regex_object = re.compile(r'(\+\d{3}) (\d{2} \d{3} \d{4})')

mo = regex_object.search('Pick out the phone number: +233 54 502 9074')

print([mo.group](http://mo.group)())

>>>>

+233 54 502 9074

Match.groups(default=None)

groups()возвращает кортеж подгрупп, соответствующих заданной строке. Группы шаблонов регулярных выражений всегда заключаются в круглые скобки — ()— и эти группы возвращаются при совпадении как элементы кортежа:

regex_object = re.compile(r'(\+\d{3}) (\d{2}) (\d{3}) (\d{4})')

mo = regex_object.search('Pick out the phone number: +233 54 502 9074')

print(mo.groups())

>>>>

('+233', '54', '502', '9074')

Match.start([group]) & Match.end([group])

Метод start()возвращает начальный индекс, а end()метод возвращает конечный индекс объекта соответствия:

regex_object = re.compile(r'\s\w+')

mo = regex_object.search('Match any word after a space')

print('Match begins at', mo.start(), 'and ends', mo.end())

print([mo.group](http://mo.group)())

>>>>

Match begins at 5 and ends 9

any

В приведенном выше примере есть шаблон регулярного выражения для сопоставления любого символа слова после пробела. Найдено совпадение — ’ any’— начиная с позиции 5 и заканчивая 9.

Pattern.search(string[, pos[, endpos]])

Значение posуказывает позицию индекса, с которой должен начинаться поиск объекта совпадения. endposуказывает, где должен остановиться поиск соответствия. Значение для обоих posи endposможет быть передано в качестве аргументов в методы search()или match()после строки. Вот как это работает:

regex_object = re.compile(r'[a-z]+[0-9]')

mo = regex_object.search('find the alphanumeric character python3 in the string', 20 , 30)

print([mo.group](http://mo.group)())

>>>>

python3

Приведенный выше код выбирает любой буквенно-цифровой символ в строке поиска.

Поиск начинается с 20-й позиции индекса строки и останавливается на 30-й.

re Regex Flags

Python позволяет использовать флаги при использовании reметодов модуля, таких как search()и match(), что дает больше контекста для регулярных выражений. Флаги — это необязательные аргументы, которые определяют, как механизм регулярных выражений Python находит объект соответствия.

re.I (re.IGNORECASE)

Этот флаг используется при выполнении совпадения без учета регистра. Механизм регулярных выражений будет игнорировать прописные или строчные буквы шаблонов регулярных выражений:

regex_object = [re.search](http://re.search)('django', 'My tech stack comprises of python, Django, MySQL, AWS, React', re.I)

print(regex_object.group())

>>>>

Django

re.Iгарантирует, что объект соответствия будет найден, независимо от того, в верхнем или нижнем регистре он находится.

Читайте также:  Оператор instanceof в Java

re.S (ре.DOTALL)

Специальный ’.’символ соответствует любому символу, кроме новой строки. Введение этого флага также будет соответствовать новой строке в блоке текста или строки. См. пример ниже:

regex_object= [re.search](http://re.search)('.+', 'What is your favourite coffee flavor \nI prefer the Mocha')

print(regex_object.group())

>>>>

What is your favourite coffee flavor

Символ ’.’находит совпадение только с начала строки и останавливается на новой строке. Введение re.DOTALLфлага будет соответствовать символу новой строки. См. пример ниже:

regex_object= [re.search](http://re.search)('.+', 'What is your favourite coffee flavor \nI prefer the Mocha', re.S)

print(regex_object.group())

>>>>

What is your favourite coffee flavor

I prefer the Mocha

re.M (re.MULTILINE)

По умолчанию ’^’специальный символ соответствует только началу строки. С введением этого флага функция ищет совпадение в начале каждой строки. Символ ’$’соответствует шаблону только в конце строки. Но re.Mфлаг гарантирует, что он также находит совпадения в конце каждой строки:

regex_object = [re.search](http://re.search)('^J\w+', 'Popular programming languages in 2022: \nPython \nJavaScript \nJava \nRust \nRuby', re.M)

print(regex_object.group())

>>>>

JavaScript

re.X (re.VERBOSE)

Иногда шаблоны регулярных выражений Python могут быть длинными и запутанными. Флаг re.Xпомогает, когда нам нужно добавить комментарии в наш шаблон регулярного выражения. Мы можем использовать ’’’строковый формат для создания многострочного регулярного выражения с комментариями:

email_regex = [re.search](http://re.search)(r'''

[a-zA-Z0-9._%+-]+ # username composed of alphanumeric characters

@ # @ symbol

[a-zA-Z0-9.-]+ # domain name has word characters

(\.[a-zA-Z]{2,4}) # dot-something

''', 'extract the email address in this string [kwekujohnson1@gmail.com](mailto:kwekujohnson1@gmail.com) and send an email', re.X)

print(email_regex.group())

>>>>

[kwekujohnson1@gmail.com](mailto:kwekujohnson1@gmail.com)

Практические примеры регулярных выражений в Python

Давайте теперь погрузимся в некоторые более практические примеры.

Регулярное выражение проверки надежности пароля Python

Одним из самых популярных вариантов использования регулярных выражений является проверка надежности пароля. При регистрации любой новой учетной записи существует проверка, чтобы убедиться, что мы вводим соответствующую комбинацию букв, цифр и символов для обеспечения надежного пароля.

Вот пример регулярного выражения для проверки надежности пароля:

password_regex = re.match(r"""

^(?=.*?[A-Z]) # this ensures user inputs at least one uppercase letter

(?=.*?[a-z]) # this ensures user inputs at least one lowercase letter

(?=.*?[0-9]) # this ensures user inputs at least one digit

(?=.*?[#?!@$%^&*-]) # this ensures user inputs one special character

.{8,}$ #this ensures that password is at least 8 characters long

""", '@Sit3po1nt', re.X)

print('Your password is' ,password_regex.group())

>>>>

Your password is @Sit3po1nt

Обратите внимание на использование ’^’и ’$’, чтобы убедиться, что входная строка (пароль) соответствует регулярному выражению.

Поиск и замена Python в регулярном выражении файла

Вот наша цель для этого примера:

  • Создайте файл «pangram.txt».
  • Добавьте простой текст в файл,»The five boxing wizards climb quickly.»
  • Напишите простое регулярное выражение Python для поиска и замены слова «взбираться» на слово «прыжок», чтобы получилась панграмма.

Вот код для этого:

#importing the regex module

import re

file_path="pangram.txt"

text="climb"

subs="jump"

#defining the replace method

def search_and_replace(filePath, text, subs, flags=):

with open(file_path, "r+") as file:

#read the file contents

file_contents = [file.read](http://file.read)()

text_pattern = re.compile(re.escape(text), flags)

file_contents = text_pattern.sub(subs, file_contents)

[file.seek](http://file.seek)()

file.truncate()

file.write(file_contents)

#calling the search_and_replace method

search_and_replace(file_path, text, subs)

Регулярное выражение веб-скрейпинга Python

Иногда вам может понадобиться собрать некоторые данные в Интернете или автоматизировать простые задачи, такие как просмотр веб-страниц. Регулярные выражения очень полезны при извлечении определенных данных онлайн. Ниже приведен пример:

import urllib.request

phone_number_regex = r'\(\d{3}\) \d{3}-\d{4}'

url = 'https://www.summet.com/dmsi/html/codesamples/addresses.html'

# get response

response = urllib.request.urlopen(url)

# convert response to string

string_object = [response.read](http://response.read)().decode("utf8")

# use regex to extract phone numbers

regex_object = re.compile(phone_regex)

mo = regex_object.findall(string_object)

# print top 5 phone numbers

print(mo[: 5])

>>>>

['(257) 563-7401', '(372) 587-2335', '(786) 713-8616', '(793) 151-6230', '(492) 709-6392']

Заключение

Регулярные выражения могут варьироваться от простых до сложных. Как показывают приведенные выше примеры, они являются жизненно важной частью программирования. Чтобы лучше понять регулярное выражение в Python, хорошо бы начать со знакомства с такими вещами, как классы символов, специальные символы, якоря и конструкции группировки.

Мы можем пойти намного дальше, чтобы углубить наше понимание регулярных выражений в Python. Модуль Python reупрощает и ускоряет запуск.

Regex значительно сокращает объем кода, который нам нужно написать для таких вещей, как проверка ввода и реализация алгоритмов поиска.

Также хорошо иметь возможность отвечать на вопросы об использовании регулярных выражений, так как они часто возникают на технических собеседованиях с инженерами и разработчиками программного обеспечения.

Оцените статью
bestprogrammer.ru
Добавить комментарий

Adblock
detector