🐍 Π‘Π°ΠΌΠΎΡƒΡ‡ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎ Python для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…. Π§Π°ΡΡ‚ΡŒ 16: РСгулярныС выраТСния

Рассмотрим встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ модуля re, научимся ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Regex-выраТСния ΠΈ ΡƒΠ·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°ΡŽΡ‰ΠΈΠ΅ ΠΈ рСтроспСктивныС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ – ΠΏΠΎΠ·ΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΈ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ, ΠΊΠ°ΠΊ всСгда, – 10 интСрСсных Π·Π°Π΄Π°Π½ΠΈΠΉ с Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ.

🐍 Π‘Π°ΠΌΠΎΡƒΡ‡ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎ Python для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…. Π§Π°ΡΡ‚ΡŒ 16: РСгулярныС выраТСния

РСгулярныС выраТСния (Regex) – это особыС ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ для поиска ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… подстрок Π² тСкстовых Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… ΠΈ Π½Π° Π²Π΅Π±-страницах. ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡ Regex появилась Π² 1951 Π³ΠΎΠ΄Ρƒ, стала популярной ΠΊ 1968 Π³ΠΎΠ΄Ρƒ, ΠΈ с Ρ‚Π΅Ρ… ΠΏΠΎΡ€ Π² Ρ‚ΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ стСпСни поддСрТиваСтся Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ языков программирования ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния. РСгулярныС выраТСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² тСкстовых Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°Ρ…, Π² Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°Ρ… ОБ, Π² OCR-прилоТСниях для распознавания тСкста, Π² ΠΎΠ½Π»Π°ΠΉΠ½-поисковиках ΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ…. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ для:

  • Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ…;
  • лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°;
  • опрСдСлСния Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈ прСобразования URL (Apache http.conf, mod_rewrite);
  • составлСния слоТных SQL-запросов;
  • создания кастомных шаблонов URL-диспСтчСра (re_path() Django).

РСгулярныС выраТСния Π² Python

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Regex Π² Python ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ встроСнный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ re, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ входят:

  • Набор Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для поиска ΠΈ Π·Π°ΠΌΠ΅Π½Ρ‹ подстрок – Π½ΠΈΠΆΠ΅ ΠΌΡ‹ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования основных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².
  • ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ re.compile – ΠΎΠ½ создаСт Regex-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ для ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования ΠΈ ускоряСт Ρ€Π°Π±ΠΎΡ‚Ρƒ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅.

РСгулярныС выраТСния состоят ΠΈΠ· Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ² (Π±ΡƒΠΊΠ² ΠΈ Ρ†ΠΈΡ„Ρ€) ΠΈ мСтасимволов. Для экранирования спСцсимволов ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Π΅ слэши \, ΠΈΠ»ΠΈ ΠΆΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² r-строку . Π’Π°ΠΊΠΎΠΉ шаблон, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ email-адрСса:

r'^[a-zA-Z0-9._-]+@[a-zA-Z-.]+$'

Π­Ρ‚ΠΎΡ‚ шаблон – ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΡ…, Regex-выраТСния для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ email-адрСсов ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ слоТнСС. Для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ тСстирования слоТных Regex шаблонов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ сСрвисы, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Regex101:

regex101 – популярный ΠΎΠ½Π»Π°ΠΉΠ½ конструктор Regex-шаблонов
regex101 – популярный ΠΎΠ½Π»Π°ΠΉΠ½ конструктор Regex-шаблонов

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Regex ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² Python

re.match() – провСряСт, начинаСтся Π»ΠΈ строка с Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°:

import re
lst = ['abrakadabra', 'https://kadabra.com', 'https://proglib.io/p/weekly-23-novosti-podkasty-otbornye-stati-i-obuchayushchie-materialy-po-frontendu-2023-02-14 - ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎ этой ссылкС',
       'http//:mysite.ru', 'www.abra.com', 'http//abra.com', 'https://abra.com/', 'это ΠΌΠΎΠΉ сайт - https://abrakadabra.com/',
       'https://ru.wikipedia.org/wiki/%D0%9B%D1%8F%D0%B3%D1%83%D1%88%D0%BA%D0%B0-%D0%B3%D0%BE%D0%BB%D0%B8%D0%B0%D1%84']
url = r'https?://(www.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()!@:%_+.~#?&/=]*)'
for i in lst:
    m = re.match(url, i)
    if m:
        print(m.group(0)) # валидная ссылка извлСкаСтся ΠΈΠ· Π½Π°Ρ‡Π°Π»Π° строки

Π’Ρ‹Π²ΠΎΠ΄:

https://kadabra.com
https://proglib.io/p/weekly-23-novosti-podkasty-otbornye-stati-i-obuchayushchie-materialy-po-frontendu-2023-02-14
https://abra.com/
https://ru.wikipedia.org/wiki/%D0%9B%D1%8F%D0%B3%D1%83%D1%88%D0%BA%D0%B0-%D0%B3%D0%BE%D0%BB%D0%B8%D0%B0%D1%84

Если Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ содСрТится Π² тСкстС, Π½ΠΎ Π½Π΅ Π² Π½Π°Ρ‡Π°Π»Π΅ строки – re.match() Π²Π΅Ρ€Π½Π΅Ρ‚ None:

>>> import re
>>> s = 'ΠΎΠΉ, ΠΌΠΎΡ€ΠΎΠ·, ΠΌΠΎΡ€ΠΎΠ·, Π½Π΅ ΠΌΠΎΡ€ΠΎΠ·ΡŒ мСня'
>>> print(re.match('ΠΌΠΎΡ€ΠΎΠ·', s))
None

ΠœΠ΅Ρ‚ΠΎΠ΄ re.fullmatch() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ совпадСниС, Ссли вся строка ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ соотвСтствуСт ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ:

>>> st1, st2 = 'ΠΎΠ΄Π½Π° строка', 'строка'
>>> print(re.fullmatch(r'строка', st1))
None
>>> print(re.fullmatch(r'строка', st2))
<re.Match object; span=(0, 6), match='строка'>

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ подстроки Π² тСкст, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ re.search(), ΠΏΡ€ΠΈ нСобходимости – с Ρ„Π»Π°Π³ΠΎΠΌ re.I для игнорирования рСгистра:

>>> s = 'Π‘ΠΈΠ½ΠΈΠΉ, синий ΠΈΠ½Π΅ΠΉ Π»Π΅Π³ Π½Π° ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π°'
>>> print(re.search('синий', s, re.I))
<re.Match object; span=(0, 5), match='Π‘ΠΈΠ½ΠΈΠΉ'>

ΠœΠ΅Ρ‚ΠΎΠ΄ re.search() ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ span(), string ΠΈ group().

span Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ индСксы вхоТдСния:

>>> text = 'ΠžΠ΄Π½Π°ΠΆΠ΄Ρ‹ вСсною, Π² час Π½Π΅Π±Ρ‹Π²Π°Π»ΠΎ ΠΆΠ°Ρ€ΠΊΠΎΠ³ΠΎ Π·Π°ΠΊΠ°Ρ‚Π°, Π² МосквС, Π½Π° ΠŸΠ°Ρ‚Ρ€ΠΈΠ°Ρ€ΡˆΠΈΡ… ΠΏΡ€ΡƒΠ΄Π°Ρ…, появились Π΄Π²Π° Π³Ρ€Π°ΠΆΠ΄Π°Π½ΠΈΠ½Π°.'
>>> print(re.search('ΠΏΡ€ΡƒΠ΄', text).span())  
(71, 75)

string Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ искомый Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚:

>>> st = 'Π”Ρ€Π°ΠΊΡƒΠ»Π° Брэма Π‘Ρ‚ΠΎΠΊΠ΅Ρ€Π°'
>>> print(re.search('Π‘Ρ‚ΠΎΠΊ', st).string) 
Π”Ρ€Π°ΠΊΡƒΠ»Π° Брэма Π‘Ρ‚ΠΎΠΊΠ΅Ρ€Π°

group Π²Π΅Ρ€Π½Π΅Ρ‚ подстроку, ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΡƒΡŽ с запросом:

>>> st = 'ΠΏΡ€ΠΈΠΌΠ΅Ρ€ домашнСго Ρ…ΠΈΡ‰Π½ΠΈΠΊΠ°: ΠΊΠΎΡ‚' 
>>> print(' тСкст Π½Π°ΠΉΠ΄Π΅Π½ - ', re.search(r'Ρ…ΠΈΡ‰Π½ΠΈΠΊΠ°:\s\w\w\w', st).group())
тСкст Π½Π°ΠΉΠ΄Π΅Π½ - Ρ…ΠΈΡ‰Π½ΠΈΠΊΠ°: ΠΊΠΎΡ‚

ВсС вхоТдСния Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ re.findall():

>>> st = 'Eins Hier kommt die Sonne, Zwei Hier kommt die Sonne'
>>> print(re.findall('Hier kommt die Sonne', st))
['Hier kommt die Sonne', 'Hier kommt die Sonne']

ΠœΠ΅Ρ‚ΠΎΠ΄ re.split() раздСляСт строку ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ:

>>> st = 'ΠΌΠΎΡ€ΠΎΠ· ΠΈ солнцС, дСнь чудСсный'
>>> print(re.split(r'\sΠΈ\s', st, 1))
['ΠΌΠΎΡ€ΠΎΠ·', 'солнцС, дСнь чудСсный']

Для Π·Π°ΠΌΠ΅Π½Ρ‹ символов ΠΈ подстрок ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ re.sub(). Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ прСдусматриваСт ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈΠ· тСкста всСх символов, ΠΊΡ€ΠΎΠΌΠ΅ Π±ΡƒΠΊΠ², Ρ†ΠΈΡ„Ρ€, Π·Π½Π°ΠΊΠ° ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π½Π° Π½ΠΎΠ²ΡƒΡŽ строку, Ρ‚ΠΎΡ‡ΠΊΠΈ, ΠΏΡ€ΠΎΠ±Π΅Π»Π°, Π²ΠΎΠΏΡ€ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΠΊΠ° ΠΈ запятой:

>>> st = 'П#$%^Ρ€ΠΈΠ²&*Π΅Ρ‚, ΠΊΠ°@!ΠΊ успС~@Ρ…ΠΈ с Py$%^*&thon?'
>>> print(re.sub('[^а-яА-Яa-zA-Z0-9,? \n\.]', '', st))
ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΊΠ°ΠΊ успСхи с Python?

Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ скомпилированных Regex-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ re.compile() ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° шаблон выраТСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ:

import re
url_lst = ['https://mysite.ru/uploads/2023/2/1/image.jpg',
           'https://mysite.ru/uploads/2023/2/1/image.html',
           'http://www.mysite.ru/uploads/2022/2/1/another_image.png',
           'http://mysite.ru/uploads/2022/12/15/images.doc',
           'https://www.mysite.ru/uploads/2022/12/11/image22.jpg',
           'http://mysite.ru/images/2023/2/5/gifimage.gif',
           'https://mysite.ru/texts/2023/2/1/novel.txt',
           'https://mysite.ru/books/2023/2/1/book.epub']
img_url = re.compile(r'https?://(www)?.*.(png|jpg|gif)')
for url in url_lst:
    if img_url.match(url):
        print(url)

Π’Ρ‹Π²ΠΎΠ΄:

https://mysite.ru/uploads/2023/2/1/image.jpg
http://www.mysite.ru/uploads/2022/2/1/another_image.png
https://www.mysite.ru/uploads/2022/12/11/image22.jpg
http://mysite.ru/images/2023/2/5/gifimage.gif

Как ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, скомпилированныС выраТСния ΡƒΠ΄ΠΎΠ±Π½Ρ‹ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ – ΠΎΠ½ΠΈ, ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅, быстрСС Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚. Π§Π΅ΠΌ слоТнСС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Ρ‡Π΅ΠΌ большС объСм ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… – Ρ‚Π΅ΠΌ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Π΅Π΅ прСимущСство. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, насколько отличаСтся ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ рСгулярного выраТСния ΠΎΡ‚ скомпилированного – возьмСм ΠΎΠ±ΡŠΠ΅ΠΌΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» (Β«ΠŸΡ€Π΅ΡΡ‚ΡƒΠΏΠ»Π΅Π½ΠΈΠ΅ ΠΈ Π½Π°ΠΊΠ°Π·Π°Π½ΠΈΠ΅Β» Π€. М. ДостоСвского) ΠΈ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅ΠΌ поиск всСх строк, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ содСрТатся имя Β«Π ΠΎΠ΄ΠΈΠΎΠ½Β» ΠΈ фамилия «Раскольников» Π² Π»ΡŽΠ±Ρ‹Ρ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… склонСниях, ΠΏΡ€ΠΈ этом ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈ Ρ„Π°ΠΌΠΈΠ»ΠΈΠ΅ΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 5 Π΄Ρ€ΡƒΠ³ΠΈΡ… слов:

import re
import time

start = time.time()
with open('prestuplenie-i-nakazanie.txt', 'r', encoding='utf8') as book:
    result = [line for line in book if re.findall(r'\bРодио\w{0,3}(?:\s+\S+){0,5}\s+Раскольнико\w{0,3}\b', line)]
print(f'НайдСно {len(result)} совпадСний. Поиск Π±Π΅Π· компиляции занял {time.time() - start:.2f} сСкунд')

start = time.time()
with open('prestuplenie-i-nakazanie.txt', 'r', encoding='utf8') as book:
    find_name = re.compile(r'\bРодио\w{0,3}(?:\s+\S+){0,5}\s+Раскольнико\w{0,3}\b')
    result2 = [line for line in book if find_name.findall(line)]
print(f'НайдСно {len(result2)} совпадСний. Поиск с компиляциСй занял {time.time() - start:.2f} сСкунд')

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

НайдСно 5 совпадСний. Поиск Π±Π΅Π· компиляции занял 0.11 сСкунд
НайдСно 5 совпадСний. Поиск с компиляциСй занял 0.07 сСкунд
***

ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ! Π’Ρ‹ освоили всС основныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с рСгулярными выраТСниями.

Π’Ρ‹ ΡƒΠΌΠ΅Π΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ findall, sub ΠΈ search, ΠΈ Π΄Π°ΠΆΠ΅ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ re.compile.

Но настоящая сила Regex β€” Π² ΡƒΠΌΠ΅Π½ΠΈΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ собствСнныС, Π΄Π°ΠΆΠ΅ самыС слоТныС ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹. Π“ΠΎΡ‚ΠΎΠ²Ρ‹ ΡΡ‚Π°Ρ‚ΡŒ Ρ‚Π΅ΠΌ, ΠΊΡ‚ΠΎ Π½Π΅ ΠΈΡ‰Π΅Ρ‚ ΠΈΡ… Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅, Π° создаСт сам? Π’ ΠΏΠΎΠ»Π½ΠΎΠΉ вСрсии ΡƒΡ€ΠΎΠΊΠ° вас ΠΆΠ΄Ρ‘Ρ‚:

  • ΠŸΠΎΠ»Π½Ρ‹ΠΉ справочник ΠΏΠΎ всСм мСтасимволам, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡΠΌ ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°ΠΌ для создания Regex-шаблонов любой слоТности.
  • ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π³Ρ€ΡƒΠΏΠΏΡ‹, Ρ„Π»Π°Π³ΠΈ ΠΈ ΠΌΠΎΡ‰Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ (lookarounds).
  • 10 практичСских Π·Π°Π΄Π°Ρ‡, Π³Π΄Π΅ Π²Ρ‹ с нуля Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ рСгулярныС выраТСния для парсинга, Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ ΠΈ слоТной Π·Π°ΠΌΠ΅Π½Ρ‹ тСкста.


Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

admin
11 дСкабря 2018

ООП Π½Π° Python: ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python допускаСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Π½ΠΎ Π² Π΅Π³ΠΎ основС...
admin
28 июня 2018

3 самых Π²Π°ΠΆΠ½Ρ‹Ρ… сфСры примСнСния Python: возмоТности языка

БущСствуСт мноТСство областСй примСнСния Python, Π½ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ особСнно...
admin
13 фСвраля 2017

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python: ΠΎΡ‚ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ° Π΄ΠΎ профСссионала

Пошаговая инструкция для всСх, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python...