Разработка сайта для Вашего бизнеса. Веб дизайн. Дизайн логотипа, фирменного стиля, рекламная фотография . Комплексный рекламный креатив.

Ralex. We do the work.
На рынке с 1999го года. Средняя ценовая категория. Ориентация на эффективность решений.
Ознакомтесь с нашим портфолио
Узнайте больше о услугах
Свяжитесь с нами:
E-mail: [email protected]
Tel: (044) 587 - 84 - 78
Custom web design & дизайн и разработка сайта "под ключ"
Креативный, эффективный дизайн. Система управления сайтом (СУС).
Custom flexible разработка систем электронной коммерции
Система e-commerce разрабатывается под индивидуальные потребности. Гибкая функциональность.
Search Engine Optimzation & оптимизация под поисковые системы (SEO)
Постоянная оптимизация и мониторинг сайта в поисковых системах. Достигаем результата быстро и эффективно
Custom logo design & дизайн логотипа и фирменного стиля
Многолетний опыт. Огромное портфолио. Уникальное предложение и цена.
профессиональная рекламная фотография
креативно, смело, качественно
Custom logo design & рекламный креатив. дизайн рекламы
Многолетний опыт. Огромное портфолио. Уникальное предложение и цена.

Регулярні вирази в Python від простого до складного. Подробиці, приклади, картинки, вправи

  1. зміст
  2. Приклади регулярних виразів
  3. Сила і відповідальність
  4. Документація і посилання
  5. Шаблони, що відповідають одному символу
  6. Квантіфікатори (зазначення кількості повторень)
  7. Жадібність в регулярки і кордони знайденого шаблону
  8. перетин подстрок
  9. Експерименти в пісочниці
  10. Регулярки в Пітоні
  11. Приклад використання всіх основних функцій
  12. Тонкощі екранування в Пітоні ( '\\\\\\\\ foo')
  13. Використання додаткових прапорів в Пітоні
  14. Написання та тестування регулярних виразів
  15. Завдання - 1
  16. Дужкові групи (?: ...) і перерахування |
  17. Дужкові групи (угруповання плюс квантіфікатори)
  18. Дужки плюс перерахування
  19. ще приклади
  20. Завдання - 2
  21. Групуються дужки (...) і match-об'єкти в Пітоні
  22. Групуються дужки (...)

Наша взаимовыгодная связь https://banwar.org/

Вирішив я недавно моїм школярам дати задачок на регулярні вирази для вивчення

Вирішив я недавно моїм школярам дати задачок на регулярні вирази для вивчення. А до завдань потрібна якась теорія. І став я шукати хороші тексти російською. П'ят стерпних знайшов, але все не те. Щось зім'яте, щось упущено. У цих текстів був не тільки фатальний недолік. Мало картинок, мало прикладів. І майже немає розумних завдань. Ну невже пошук IP-адреси - це найчастіша завдання для регулярних виразів? Ось і я думаю, що ні.
Про різницю (?: ...) / (...) фіг знайдеш, а без цього знання в деяких випадках можна тільки страждати.

Плюс в Пітоні є чимало регулярних булочок. Наприклад, re.split може додавати той шматок тексту, за яким був розріз, в список частин. А в re.sub можна замість шаблону для заміни передати функцію. Це - реальні речі, які прямо дуже потрібні, але ніхто про це не пише.
Так і народився цей досить многобуквенний матеріал з подробицями, тонкощами, картинками і завданнями.

Сподіваюся, вам вдасться з нього витягти що-небудь нове і корисне, навіть якщо ви вже в ладах з регулярки.
PS. Рішення задач школярі здають в системою тестування, тому завдання оформлені в кілька формальному вигляді.

зміст

Регулярні вирази в Python від простого до складного ;
зміст ;
Приклади регулярних виразів ;
Сила і відповідальність ;
Документація і посилання ;
основи синтаксису ;
Шаблони, що відповідають одному символу ;
Квантіфікатори (зазначення кількості повторень) ;
Жадібність в регулярки і кордони знайденого шаблону ;
перетин подстрок ;
Експерименти в пісочниці ;
Регулярки в Пітоні ;
Приклад використання всіх основних функцій ;
Тонкощі екранування в Пітоні ( '\\\\\\\\ foo') ;
Використання додаткових прапорів в Пітоні ;
Написання та тестування регулярних виразів ;
Завдання - 1 ;
Дужкові групи (?: ...) і перерахування | ;
Перерахування (операція «АБО») ;
Дужкові групи (угруповання плюс квантіфікатори) ;
Дужки плюс перерахування ;
ще приклади ;
Завдання - 2 ;
Групуються дужки (...) і match-об'єкти в Пітоні ;
Match-об'єкти ;
Групуються дужки (...) ;
Тонкощі з дужками і нумерацією груп. ;
Групи і re.findall ;
Групи і re.split ;
Використання груп при замінах ;
Заміна з обробкою шаблону функцією в Пітоні ;
Посилання на групи при пошуку ;
Завдання - 3 ;
Шаблони, що відповідають не конкретного тексту, а позиції ;
Прості шаблони, відповідні позиції ;
Складні шаблони, відповідні позиції (lookaround і Co) ;
lookaround на прикладі королів та імператорів Франції ;
Завдання - 4 ;
Post scriptum ;

Регулярний вираз - це рядок, що задає шаблон пошуку подстрок в тексті. Одним шаблоном може відповідати багато різних рядків. Термін «Регулярні вирази» є перекладом англійського словосполучення «Regular expressions». Помилка перекладу дуже точно відображає зміст, правильніше було б «шаблонні вирази». Регулярний вираз, або коротко «регулярки», складається зі звичайних символів і спеціальних командних послідовностей. Наприклад, \ d задає будь-яку цифру, а \ d + - задає будь-яку послідовність з однієї або більше цифр. Робота з регулярки реалізована у всіх сучасних мовах програмування. Однак існує кілька «діалектів», тому функціонал регулярних виразів може відрізнятися від мови до мови. У деяких мовах програмування регулярки користуватися дуже зручно (наприклад, в Пітоні), в деяких - не дуже (наприклад, в C ++).

Приклади регулярних виразів

Регулярки Її сенс simple text У точності текст «simple text» \ d {5} Послідовності з 5 цифр
\ D означає будь-яку цифру
{5} - рівно 5 разів \ d \ d / \ d \ d / \ d {4} Дати в форматі ДД / ММ / РРРР
(Та інші шматки, на них схожі, наприклад, 98/76/5432) \ b \ w {3} \ b Слова в точності з трьох букв
\ B означає кордон слова
(З одного боку буква, а з іншого - немає)
\ W - будь-яка буква,
{3} - рівно три рази [- +]? \ D + Ціле число, наприклад, 7, +17, -42, 0013 (можливі провідні нулі)
[- +]? - або -, або +, або порожньо
\ D + - послідовність з 1 або більше цифр [- +]? (?: \ D + (?: \. \ D *)? | \. \ D +) (?: [EE] [- +]? \ D +)? Дійсне число, можливо в експоненційної запису
Наприклад, 0.2, +5.45, -.4, 6e23, -3.17E-14.
Див. Нижче картинку.

Сила і відповідальність

Регулярні вирази, або коротко, регулярки - це дуже потужний інструмент. Але використовувати їх слід з розумом і обережністю, і тільки там, де вони дійсно приносять користь, а не шкоду. По-перше, погано написані регулярні вирази працюють повільно. По-друге, їх часто дуже складно читати, особливо якщо регулярка написана не особисто тобою п'ять хвилин назад. По-третє, дуже часто навіть невелика зміна завдання (того, що потрібно знайти) призводить до значної зміни виразу. Тому про регулярки часто говорять, що це write only code (код, який тільки пишуть з нуля, але не читають і не правлять). А також жартують: Деякі люди, коли стикаються з проблемою, думають «Я знаю, я вирішу її за допомогою регулярних виразів.» Тепер у них дві проблеми. Ось приклад write-only регулярки (для перевірки валідності e-mail адреси (не треба так робити !!!)):

(?: [A-z0-9! # $% & '* + / =? ^ _ `{|} ~ -] + (?: \. [A-z0-9! # $% &' * + / =? ^ _ `{|} ~ -] +) * |" (?: [\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x21 \ x23- \ x5b \ x5d- \ x7f] | \\ [\ x01- \ x09 \ x0b \ x0c \ x0e- \ x7f]) * ") @ (?: (?: [a-z0-9] (?: [a-z0-9 -] * [a-z0 -9])? \.) + [a-z0-9] (?: [a-z0-9 -] * [a-z0-9])? | \ [(? :( ?: 25 [0- 5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9]?) \.) {3} (?: 25 [0-5] | 2 [0 -4] [0-9] | [01]? [0-9] [0-9]? | [a-z0-9 -] * [a-z0-9]: (?: [\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x21- \ x5a \ x53- \ x7f] | \\ [\ x01- \ x09 \ x0b \ x0c \ x0e- \ x7f]) +) \])

А от тут точніша регулярка для перевірки коректності email адреси стандарту RFC822. Якщо раптом будете перевіряти email, то не робіть так! Якщо адреса вводить користувач, то нехай вводить майже що завгодно, лише б там була собака. Надійніше всього відправити туди лист і переконатися, що користувач може його отримати.

Документація і посилання

основи синтаксису

Будь-яка рядок (в якій немає символів. ^ $ * +? {} [] \ | ()) Сама по собі є регулярним виразом. Так, висловом Хаха буде відповідати рядок "Хаха" і тільки вона. Регулярні вирази є чутливі до регістру, тому рядок "хаха" (з маленької літери) вже не буде відповідати висловом вище. Подібно рядках в мові Python, регулярні вирази мають спецсимволи. ^ $ * +? {} [] \ | (), Які в регулярки є керуючими конструкціями. Для написання їх просто як символів потрібно їх екранувати, для чого потрібно поставити перед ними знак \. Так само, як і в пітона, в регулярних вирази вираз \ n відповідає кінцю рядка, а \ t - табуляції.

Шаблони, що відповідають одному символу

У всіх прикладах нижче відповідності регулярному виразу виділяються бірюзовим кольором з підкресленням.

Шаблон Опис Приклад Застосовуємо до тексту. Один будь-який символ, крім нового рядка \ n. м.л.ко молоко, малако,
І м0л0ко Іхлеб \ d Будь-яка цифра СУ \ d \ d СУ-35БМ, СУ11 1, АЛ СУ14 \ D Будь-який символ, крім цифри 926 \ D123 926) 123, 1 926-123 4 \ s Будь символ пробілу (пробіл, табуляція, кінець рядка і т.п.) бор \ sода бор ода, бор
ода, борода \ S Будь непробельний символ \ S123 X123, я123,! 123 456, 1 + 123456 \ w Будь-яка буква (то, що може бути частиною слова), а також цифри і _ \ w \ w \ w Рік, f_3, qwe rt \ W Будь-яка НЕ-буква, що не-цифра і не підкреслення сом \ W сом! , Сом? [..] Один із символів в дужках,
а також будь-який символ з діапазону ab [0-9] [0-9A-Fa-f] 12, 1F, 4B [^ ..] Будь-який символ, крім перерахованих <[^>]> <1>, <a>, <>> \ d≈ [0-9],
\ D≈ [^ 0-9],
\ W≈ [0-9a-zA-Z
а-яА-ЯёЁ],
\ S≈ [\ f \ n \ r \ t \ v] Буква "е" не включається до загального діапазон букв!
Взагалі кажучи, в \ d включається все, що в Юніком позначено як «цифра», а в \ w - як буква. Ще багато всього! [Abc-], [-1] якщо потрібен мінус, його потрібно вказати останнім або першим [* [(+ \\\] \ t] всередині дужок потрібно екранувати тільки] і \ \ b Початок або кінець слова (зліва порожньо або НЕ -буква, праворуч буква і навпаки).
На відміну від попередніх відповідає позиції, а не символу \ bвал вал, перевал, Перевалка \ B Чи не межа слова: або і зліва, і справа літери,
або і зліва, і справа НЕ букви \ Bвал пере вал, вал, Пере вал ка \ Bвал \ B перевал, вал, Пере вал ка

Квантіфікатори (зазначення кількості повторень)

Шаблон Опис Приклад Застосовуємо до тексту {n} Рівне n повторень \ d {4} 1, 12, 123, 1234, 12345 {m, n} Від m до n повторень включно \ d {2,4} 1, 12, 123, 1234, 12345 {m} Не менш m повторень \ d {3,} 1, 12, 123, 1234, 12345 {, n} Не більше n повторень \ d {, 2} 1, 12, 12 3? Нуль або одне входження, синонім {0,1} вали? вал, вали, вал ів * Нуль або більше, синонім {0,} СУ \ d * СУ, СУ1, СУ12, ... + Одне або більше, синонім {1,} a \) + a), a)), a) )), ba)]) *?
+?
??
{M, n}?
{, N}?
{M}? За замовчуванням квантіфікатори жадібні -
захоплюють максимально можливе число символів.
Додавання? робить їх ледачими,
вони захоплюють мінімально можливе число символів \ (. * \)
\ (. *? \) (A + b) * (c + d) * (e + f)
(A + b) * (c + d) * (e + f)

Жадібність в регулярки і кордони знайденого шаблону

Як зазначено вище, за замовчуванням квантіфікатори жадібні. Цей підхід вирішує дуже важливу проблему - проблему кордону шаблону. Скажімо, шаблон \ d + захоплює максимально можливу кількість цифр. Тому можна бути впевненим, що перед знайденим шаблоном йде не цифра, і після йде не цифра. Однак якщо в шаблоні тобто не жадібні частини (наприклад, явний текст), то підрядок може бути знайдена невдало. Наприклад, якщо ми хочемо знайти «слова», що починаються на СУ, після якої йдуть цифри, за допомогою регулярки СУ \ d *, то ми знайдемо і неправильні шаблони:

ПА СУ13 СУ12, ЩОБ СУ6 ЕНИЕ ВДАЛОСЯ.

У тих випадках, коли це важливо, умова на кордон шаблону потрібно обов'язково додавати в регулярку. Про те, як це можна робити, буде далі.

перетин подстрок

У звичайній ситуації регулярки дозволяють знайти лише непересічні шаблони. Разом з проблемою кордону слова це робить їх використання в деяких випадках більш складним. Наприклад, якщо ми вирішимо шукати e-mail адреси за допомогою неправильної регулярки \ w + @ \ w + (або навіть краще, [\ w '._ + -] + @ [\ w' ._ + -] +), то в невдалому випадку знайдемо ось що:

foo @ boo @ goo @ moo @ roo @ zoo

Тобто це з одного боку і не e-mail, а з іншого боку це не все підрядка виду текст-собака-текст, так як boo @ goo і moo @ roo пропущені.
Тобто це з одного боку і не e-mail, а з іншого боку це не все підрядка виду текст-собака-текст, так як boo @ goo і moo @ roo пропущені

Експерименти в пісочниці

Якщо ви вперше стикаєтеся з регулярними виразами, то краще за все спочатку спробувати пісочницю . Подивіться, як працюють прості шаблони і квантіфікатори. Вирішіть наступні завдання для цього тексту (можливо, до частини доведеться повернутися після наступної теорії):

  1. Знайдіть всі натуральні числа (можливо, оточені літерами);
  2. Знайдіть всі «слова», написані капс (тобто строго великими), можливо всередині справжніх слів (ааа БББ ввв);
  3. Знайдіть слова, в яких є російська буква, а коли-небудь за нею цифра;
  4. Знайдіть всі слова, що починаються з російської або латинської великої літери (\ b - межа слова);
  5. Знайдіть слова, які починаються на голосну (\ b - межа слова) ;;
  6. Знайдіть всі натуральні числа, які не перебувають всередині або на кордоні слова;
  7. Знайдіть рядки, в яких є символ * (. - це точно не кінець рядка!);
  8. Знайдіть рядки, в яких є відкриває і коли-небудь потім закриває дужки;
  9. Виділіть одним махом весь шматок змісту (в кінці прикладу, разом з тегами);
  10. Виділіть одним махом тільки текстову частину змісту, без тегів;
  11. Знайдіть порожні рядки;

Регулярки в Пітоні

Функції для роботи з регулярки живуть в модулі re. Основні функції:

Функція Її сенс re.search (pattern, string) Знайти в рядку string першу сходинку, яка підходить під шаблон pattern; re.fullmatch (pattern, string) Перевірити, чи підходить рядок string під шаблон pattern; re.split (pattern, string, maxsplit = 0) Аналог str.split (), тільки поділ відбувається за підрядками, відповідним під шаблон pattern; re.findall (pattern, string) Знайти в рядку string все непересічні шаблони pattern; re.finditer (pattern, string) Итератор всім непересічним шаблонами pattern в рядку string (видаються match-об'єкти); re.sub (pattern, repl, string, count = 0) Замінити в рядку string все непересічні шаблони pattern на repl;

Приклад використання всіх основних функцій

import re match = re.search (r '\ d \ d \ D \ d \ d', r'Телефон 123-12-12 ') print (match [0] if match else' Not found ') # -> 23 -12 match = re.search (r '\ d \ d \ D \ d \ d', r'Телефон 1231212 ') print (match [0] if match else' Not found ') # -> Not found match = re .fullmatch (r '\ d \ d \ D \ d \ d', r'12-12 ') print (' YES 'if match else' NO ') # -> YES match = re.fullmatch (r' \ d \ d \ D \ d \ d ', r'Т. 12-12') print ( 'YES' if match else 'NO') # -> NO print (re.split (r '\ W +', 'Де, скажіть мені, мої окуляри ??! ')) # -> [' Де ',' скажіть ',' мені ',' мої ',' окуляри ',' '] print (re.findall (r' \ d \ d \. \ d \ d \. \ d {4} ', r'Ета рядок написана 19.01.2018, а могла б і 01.09.2017')) # -> ['19 .01.2018 ', '01 .09.2017'] for m in re.finditer (r '\ d \ d \. \ d \ d \. \ d {4}', r'Ета рядок написана 19.01.2018, а могла б і 01.09.2017 '): print (' Дата ', m [0],' починається з позиції ', m.start ()) # -> Дата 19.01.2018 починається з позиції 20 # -> Дата 01.09.2017 починається з позиції 45 print (re.sub (r '\ d \ d \. \ D \ d \. \ D {4}', r'DD.MM.YYYY ', r'Ета рядок написана 19.01.2018, а могла б і 01.09.2017 ')) # -> Цей рядок написана DD.MM.YYYY, а могла б і DD.MM.YYYY

Тонкощі екранування в Пітоні ( '\\\\\\\\ foo')

Так як символ \ в пітоновскіх рядках також необхідно екранувати, то в результаті в шаблонах можуть виникати конструкції виду '\\\\ par'. Перший слеш означає, що наступний за ним символ потрібно залишити «як є». Третій також. В результаті з точки зору пітона '\\\\' означає просто два слеша \\. Тепер з точки зору движка регулярних виразів, перший слеш екранує другий. Тим самим як шаблон для регулярки "\\\\ par 'означає просто текст \ par. Для того, щоб не було таких нагромаджень слешів, перед відкриває лапками потрібно поставити символ r, що скаже пітонові «не розглядає \ як екранує символ (крім випадків екранування відкриває лапки)». Відповідно можна буде писати r '\\ par'.

Використання додаткових прапорів в Пітоні

Кожній з функцій, перерахованих вище, можна дати додатковий параметр flags, що дещо змінить режим роботи регулярок. Як значення потрібно передати суму обраних констант, ось вони:

Константа Її сенс re.ASCII За замовчуванням \ w, \ W, \ b, \ B, \ d, \ D, \ s, \ S відповідають
все Юнікодние символи з відповідною якістю.
Наприклад, \ d відповідають не тільки арабські цифри,
але і ось такі: 0123456789.
re.ASCII прискорює роботу,
якщо все відповідності лежать всередині ASCII. re.IGNORECASE Чи не розрізняти великі і маленькі букви.
Працює повільніше, але іноді зручно re.MULTILINE Спеціальні символи ^ і $ відповідають
початку і кінця кожного рядка re.DOTALL За замовчуванням символ \ n кінця рядка не підходить під точку.
З цим прапором точка - взагалі будь-який символ import re print (re.findall (r '\ d +', '12 + 67 ')) # -> [' 12 ',' 67 '] print (re.findall (r' \ w + ',' Hello, світ! ')) # -> [' Hello ',' світ '] print (re.findall (r' \ d + ', '12 + 67', flags = re.ASCII)) # - > [ '12'] print (re.findall (r '\ w +', 'Hello, світ!', flags = re.ASCII)) # -> [ 'Hello'] print (re.findall (r '[уеиаоеяію ] + ',' ОООО ааааа ррррр Иииии яяяя ')) # -> [' ааааа ',' яяяя '] print (re.findall (r' [уеиаоеяію] + ',' ОООО ааааа ррррр Иииии яяяя ', flags = re .IGNORECASE)) # -> [ 'ОООО', 'ааааа', 'Иииии', 'яяяя'] text = r "" "Торт з вішней1 вішней2" "" print (re.findall (r'Торт.с ', text)) # -> [] print (re.findall (r'Торт.с ', text, flags = re.DOTALL)) # -> [' Торт \ nс '] print (re.findall (r'віш \ w + ', text, flags = re.MULTILINE)) # -> [' вішней1 ',' вішней2 '] print (re.findall (r' ^ виш \ w + ', text, flags = re.MULTILINE)) # -> [ 'вішней2']

Написання та тестування регулярних виразів

Для написання і тестування регулярних виразів зручно використовувати сервіс https://regex101.com (Не забудьте поставити галочку Python в розділі FLAVOR зліва) або текстовий редактор Sublime text 3 .

Завдання - 1

Завдання 01. Реєстраційні знаки транспортних засобів

У Росії застосовуються реєстраційні знаки декількох видів.
Загального в них те, що вони складаються з цифр і букв. Причому використовуються тільки 12 букв кирилиці, що мають графічні аналоги в латинському алфавіті - А, В, Е, К, М, Н, О, Р, С, Т, У і Х.

У приватних легкових автомобілях номера - це буква, три цифри, дві букви, потім дві або три цифри з кодом регіону. У таксі - дві літери, три цифри, потім дві або три цифри з кодом регіону. Є також та інші види , Але в цьому завданні вони не знадобляться.

Вам буде потрібно визначити, чи є послідовність літер коректним номером зазначених двох типів, і якщо є, то яким.

На вхід даються рядки, які претендують на те, щоб бути номером. Визначте тип номера. Букви в номерах - великі російські. Маленькі і англійські для простоти можна ігнорувати.

Введення Висновок С227НА777 КУ22777 Т22В7477 М227К19У9 С227НА777 Private Taxi Fail Fail Fail Завдання 02. Кількість слів Слово - це послідовність з букв (російських або англійських), всередині якої можуть бути дефіси.
На вхід дається текст, порахуйте, скільки в ньому слів.
PS. Завдання вирішується в один рядок. Ніякі хитрі техніки, не згадані вище, не потрібні. Введення Висновок Він --- сіро-буро-малинова редиска !! >>>: -> А не кіт. www.kot.ru 9 Завдання 03. Пошук e-mailов

Допустимий формат e-mail адреси регулюється стандартом RFC 5322.
Якщо говорити коротко, то e-mail складається з одного символу @ (at-символ або собака), тексту до собаки (Local-part) і тексту після собаки (Domain part). Взагалі в адресі може бути всякий свавілля (коротко можна прочитати про нього в вікіпедії ). Досить дивні штуки можуть бути дійсним адресою, наприклад:
"Very. (),:; <> [] \". VERY. \ "Very @ \\ \" very \ ". Unusual" @ [IPv6: 2001: db8 :: 1]
"() <> []:,; @ \\\"! # $% & '- / =? ^ _ `{} | ~ .A "@ (comment) exa-mple
Але більшість поштових сервісів таке пекло і вакханалію не допускають. І ми теж не будемо 🙂

Будемо розглядати тільки адреси, ім'я яких складається з не більше, ніж 64 латинських літер, цифр і символів '._ + -, а домен - з не більше, ніж 255 латинських букв, цифр і символів .-. Ні Local-part, ні Domain part не може починатися або закінчуватися на. + -, а ще в адресі не може бути більше однієї точки поспіль.
До речі, корисно знати, що частина імені після символу + ігнорується, тому можна використовувати синоніми своєї адреси (наприклад, shаshkо[email protected] і shаshkо[email protected]), для того, щоб спростити собі сортування пошти. (Правда не всі сайти дозволяють використовувати «+», на жаль)

На вхід дається текст. Необхідно вивести всі e-mail адреси, які в ньому зустрічаються. У загальному вигляді задача досить складна, тому у нас буде 3 обмеження:
дві точки всередині адреси не зустрічаються;
дві собаки всередині адреси не зустрічаються;
вважаємо, що e-mail може бути частиною «слова», тобто в boo @ ya_ru ми бачимо адреса boo @ ya, а в foo№[email protected] бачимо [email protected].

PS. Зовсім не обов'язково робити все перевірки тільки регулярки. Регулярні вирази - це просто інструмент, який робить частину завдань простими. Не потрібно робити їх назад складними 🙂

Введення Висновок Іван Іванович! Потрібен відповідь на лист від [email protected]. Не забудьте поставити в копію serge'[email protected] це важливо. [email protected] serge'[email protected] NO: foo. @ ya.ru, foo @ .ya.ru PARTLY: boo @ ya_ru, [email protected], foo№boo @ ya .ru boo @ ya [email protected] [email protected]

Дужкові групи (?: ...) і перерахування |

Перерахування (операція «АБО»)

Щоб перевірити, чи задовольняє рядок хоча б одному з шаблонів, можна скористатися аналогом оператора or, який записується за допомогою символу |. Так, деяка рядок підходить до регулярному виразу A | B тоді і тільки тоді, коли вона підходить хоча б до одного з регулярних виразів A або B. Наприклад, окремі овочі в тексті можна шукати за допомогою шаблону морквини | св [її] кл | картоплею | редиски.

Дужкові групи (угруповання плюс квантіфікатори)

Найчастіше шаблон складається з декількох повторюваних груп. Так, MAC-адресу мережевого пристрою зазвичай записується як шість груп з двох шістнадцяткових цифр, розділених символами - або:. Наприклад, 01: 23: 45: 67: 89: ab. Кожен окремий символ можна задати як [0-9a-fA-F], і можна весь шаблон записати так:
[0-9a-fA-F] {2} [: -] [0-9a-fA-F] {2} [: -] [0-9a-fA-F] {2} [: -] [0 -9a-fA-F] {2} [: -] [0-9a-fA-F] {2} [: -] [0-9a-fA-F] {2}

Ситуація стає набагато складніше, коли кількість груп заздалегідь не зафіксовано.
Щоб вирішити цю проблему в синтаксисі регулярних виразів є угруповання (?: ...). Можна писати круглі дужки з без значків?:, Однак від цього у угруповання значно змінюється зміст, регулярка починає працювати набагато повільніше. Про це буде написано нижче. Отже, якщо REGEXP - шаблон, то (?: REGEXP) - еквівалентний йому шаблон. Різниця тільки в тому, що тепер до (?: REGEXP) можна застосовувати квантіфікатори, вказуючи, скільки саме раз повинна повторитися група. Наприклад, шаблон для пошуку MAC-адреси, можна записати так:
[0-9a-fA-F] {2} (?: [: -] [0-9a-fA-F] {2}) {5}

Дужки плюс перерахування

Також дужки (?: ...) дозволяють локалізувати частину шаблону, всередині якої відбувається перерахування. Наприклад, шаблон (?: Він | той) (?: Йшов | плив) відповідає кожній з рядків «він йшов», «він плив», «той йшов», «той плив», і є синонімом він йшов | він плив | той йшов | той плив.

ще приклади

Шаблон Застосовуємо до тексту (?: \ W \ w \ d \ d) + Є м іг29 а, ту15 4б. Деякі роблять навіть м іг29ту15 4 Іл-86. (?: \ W + \ d +) + Є МІГ29 а, Ту154 б. Деякі роблять навіть міг29ту154іл86. (?: \ + 7 | 8) (?: - \ d {2,3}) {4} + 7-926-123-12-12, 8-926-123-12-12 (?: [ХХ] [аоеі] +) + Му ха - хахахехо, ну хааахооохе, так хахахехохіііі! Ха м трамвайний. \ B (?: [ХХ] [аоеі] +) + \ b Муха - хахахехо, ну хааахооохе, так хахахехохіііі! Хам трамвайний.

Завдання - 2

Завдання 04. Заміна часу

Вовочка підготував одна дуже важлива лист, але всюди вказав неправильний час.
Тому потрібно замінити всі входження часу на рядок (TBD). Час - це рядок виду HH: MM: SS або HH: MM, в якій HH - число від 00 до 23, а MM і SS - число від 00 до 59.

Введення Висновок Шановні! Якщо ви до 9:00 не повернеться валізу, то вже в 9:00:01 я за себе не відповідаю. PS. З відношенням 25:50 все нормально! Шановні! Якщо ви до (TBD) не повернеться валізу, то вже в (TBD) я за себе не відповідаю. PS. З відношенням 25:50 все нормально! Завдання 05. Дійсні числа в паскале

Pascal requires that real constants have either a decimal point, or an exponent (starting with the letter e or E, and officially called a scale factor), or both, in addition to the usual collection of decimal digits. If a decimal point is included it must have at least one decimal digit on each side of it. As expected, a sign (+ or -) may precede the entire number, or the exponent, or both. Exponents may not include fractional digits. Blanks may precede or follow the real constant, but they may not be embedded within it. Note that the Pascal syntax rules for real constants make no assumptions about the range of real values, and neither does this problem. Your task in this problem is to identify legal Pascal real constants.

Введення Висновок 1.2 1. 1.0e-55 e-12 6.5E 1e-12 + 4.1234567890E-99999 7.6e + 12.5 99 1.2 is legal. 1. is illegal. 1.0e-55 is legal. e-12 is illegal. 6.5E is illegal. 1e-12 is legal. + 4.1234567890E-99999 is legal. 7.6e + 12.5 is illegal. 99 is illegal. Завдання 06. Абревіатури

Володимир влаштувався на роботу в одне дуже важливе місце. І в першому ж документі він нічого не зрозумів,
там були суцільні ФГУП НДЦ ГІДГЕО, ФГТУ ЧШУ АПК і т.п. Тоді він вирішив зібрати все абревіатури, щоб потім знайти їх розшифровки на http://sokr.ru/ . Допоможіть йому.

Будемо вважати абревіатурою слова тільки із заголовних букв (як мінімум з двох). Якщо кілька таких слів розділені пробілами, то вони
вважаються однією абревіатурою.

Введення Висновок Це курс інформатики відповідає ФГОС і Поопо, це підтверджено ФДМ ФНЦ НИИС РАН ФГОС Поопо ФДМ ФНЦ НИИС РАН

Групуються дужки (...) і match-об'єкти в Пітоні

Match-об'єкти

Якщо функції re.search, re.fullmatch не знаходять відповідність шаблону в рядку, то вони повертають None, функція re.finditer не видає нічого. Однак якщо відповідність знайдена, то повертається match-об'єкт. Ця штука містить в собі купу корисної інформації про відповідність шаблоном. Повний набір атрибутів можна подивитися в документації , А тут наведемо найкорисніше.

Метод Опис Приклад match [0],
match.group () Підрядок, відповідна шаблоном match = re.search (r '\ w +', r '$$ What ??')
match [0] # -> 'What' match.start () Індекс в заданій стрічці, починаючи з якого йде знайдений підрядок match = re.search (r '\ w +', r '$$ What ??')
match.start () # -> 3 match.end () Індекс в заданій стрічці, що слідує одразу за знайденої подстрока match = re.search (r '\ w +', r '$$ What ??')
match.end () # -> 7

end () # -> 7

Групуються дужки (...)

Якщо в шаблоні регулярного виразу зустрічаються дужки (...) без?:, То вони стають групуються. У match-об'єкті, який повертають re.search, re.fullmatch і re.finditer, по кожній такій групі можна отримати ту ж інформацію, що і по всьому шаблоном. А саме частина підрядка, яка відповідає (...), а також індекси початку і закінчення в заданій стрічці. Досить часто це буває корисно.

import re pattern = r '\ s * ([А-Яа-яЁё] +) (\ d +) \ s *' string = r '--- Опять45 ---' match = re.search (pattern, string) print (f'Найдена подстрока> {match [0]} <з позиції {match.start (0)} кілька разів {match.end (0)} ') print (f'Группа букв> {match [1]} <з позиції {match.start (1)} кілька разів {match.end (1)} ') print (f'Группа цифр> {match [2]} <з позиції {match.start (2)} кілька разів {match.end (2 )} ') import re pattern = r '\ s * ([А-Яа-яЁё] +) (\ d +) \ s *' string = r '--- Опять45 ---' match = re Додати в обраних

Ну невже пошук IP-адреси - це найчастіша завдання для регулярних виразів?
D + (?: \. \ D *)?
D +) (?: [EE] [- +]? \ D +)?
A-z0-9] (?: [a-z0-9 -] * [a-z0-9])?
Сом?
Нуль або одне входження, синонім {0,1} вали?
Одне або більше, синонім {1,} a \) + a), a)), a) )), ba)]) *?
M, n}?
N}?
M}?
Категории
  • Биология
  • Математика
  • Краеведению
  • Лечебная
  • Наука
  • Физике
  • Природоведение
  • Информатика
  • Новости

  • Новости
    https://banwar.org/
    Наша взаимовыгодная связь https://banwar.org/. Запустив новый сайт, "Пари Матч" обещает своим клиентам незабываемый опыт и возможность выиграть крупные суммы.


    Наши клиенты
    Клиенты

    Быстрая связь

    Тел.: (044) 587-84-78
    E-mail: [email protected]

    Имя:
    E-mail:
    Телефон:
    Вопрос\Комментарий: