logo

Зіставлення шаблонів у Python з Regex

Можливо, ви вже знайомі з пошуком тексту, натиснувши ctrl-F і ввівши слова, які шукаєте. Регулярні вирази йдуть ще далі: вони дозволяють вказати шаблон тексту для пошуку. У цій статті ми побачимо, як зіставлення шаблонів у Python працює з Regex.

Regex у Python

Регулярні вирази , також називається регулярний вираз , є описом шаблону тексту. Він може виявити наявність або відсутність тексту, зіставляючи його з певним шаблоном, а також може розділити шаблон на один або кілька підшаблонів. Наприклад, a d у регулярному виразі позначає символ цифри, тобто будь-яке окреме число від 0 до 9.

Перевірте номери телефонів за допомогою регулярного виразу в Python



Наступний регулярний вираз використовується в Python щоб відповідати рядку з трьох чисел, дефіса, ще трьох чисел, ще одного дефіса та чотирьох чисел.

Any other string would not match the pattern. ddd-ddd-dddd>

Регулярні вирази можуть бути набагато складнішими. Наприклад, додавання цифри 3 у фігурних дужках ({3}) після шаблону — це все одно, що сказати: Зіставте цей шаблон тричі. Отже, трохи коротший регулярний вираз виглядає наступним чином:

організація та архітектура комп'ютера
d{3}-d{3}-d{4}>

Він відповідає правильному формату номера телефону.

Зіставлення шаблону з регулярними виразами

Об’єкт Regex пошук() метод шукає в переданому рядку будь-які збіги з регулярним виразом. Об’єкти відповідності мають метод group(), який повертає фактичний відповідний текст із шуканого рядка. Ви також можете побачитиТаблиця регулярних виразівдля отримання додаткової інформації.

приклад: Імпортуйте модуль регулярного виразу за допомогою import re. Створіть об’єкт Regex за допомогоюre.compile()функція. (Не забувайте використовувати необроблений рядок.) Передайте рядок, який ви хочете знайти, у метод search() об’єкта Regex. Це повертає об’єкт Match. Викличте метод group() об’єкта Match, щоб повернути рядок фактично зіставленого тексту.

Python3




# Python program to illustrate> # Matching regex objects> import> re> > # regex object> phoneNumRegex>=> re.>compile>(r>'ddd-ddd-dddd'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(>'Phone number found: '> +> mo.group())>

>

>

Вихід:

Phone number found: 415-555-4242>

Дужки для групування та захоплення за допомогою регулярного виразу

Одним із способів зіставлення шаблонів за допомогою Regex є використання круглих дужок навколо шаблонів. Давайте розглянемо кілька різних прикладів для кращого розуміння.

Відповідні об’єкти

Скажімо, ви хочете відокремити код міста від решти номера телефону. Додавання дужок створить групи в регулярному виразі: (ddd)-(ddd-dddd). Тоді ви можете використовувати метод об’єкта match() group(), щоб отримати відповідний текст лише з однієї групи.

Python3




import> re> phoneNumRegex>=> re.>compile>(r>'(ddd)-(ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(mo.group(>1>))> areaCode, number>=> mo.groups()> print>(>'area code:'>, areaCode)> print>(>'number:'>, number)>

>

>

Вихід:

415 area code: 415 number: 555-4242>

Отримати всі групи одночасно

Якщо ви хочете отримати всі групи одночасно, скористайтеся методом groups(), зверніть увагу на форму множини для імені.

Python3




import> re> phoneNumRegex>=> re.>compile>(r>'(ddd)-(ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(mo.groups())>

>

>

Вихід:

('415', '555-4242')>

Встановіть відповідність між дужками

Дужки мають особливе значення в регулярних виразах, але що робити, якщо вам потрібно знайти відповідність дужок у тексті. Наприклад, можливо, телефонні номери, які ви намагаєтесь зіставити, мають код міста, указаний у дужках. У цьому випадку вам потрібно екранувати символи ( і ) зворотною скісною рискою. Введіть наступне в інтерактивну оболонку:

Python3




import> re> phoneNumRegex>=> re.>compile>(r>'((ddd)) (ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My phone number is (415) 555-4242.'>)> print>(mo.group(>1>))>

>

>

Вихід:

(415)>

Екран-символи ( і ) у необробленому рядку, переданому в re.compile(), відповідатимуть фактичним символам круглих дужок.

Регулярні вирази: групування та вертикальна лінія

The | характер називається трубою. Ми можемо використовувати його будь-де, де захочемо знайти відповідність одному з багатьох виразів.

приклад: Регулярний вираз r’Batman|Tina Fey’ відповідатиме або ‘Batman’, або ‘Tina Fey’. Якщо в пошуковому рядку зустрічаються і Бетмен, і Тіна Фей, перше входження відповідного тексту буде повернено як об’єкт «Збіг».

Python3


є зразковими прикладами



# Python program to illustrate> # Matching regex objects> # with multiple Groups with the Pipe> import> re> heroRegex>=> re.>compile> (r>'Batman|Tina Fey'>)> mo1>=> heroRegex.search(>'Batman and Tina Fey.'>)> print>(mo1.group())>

>

>

Вихід:

knn
'Batman'>

Розуміння фігурних дужок у Regex

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

Наприклад, регулярний вираз (Ha){3} відповідатиме рядку «HaHaHa», але не відповідатиме «HaHa», оскільки останній має лише два повторення групи (Ha). Замість одного числа можна вказати діапазон між фігурними дужками. Регулярний вираз (Ha){3, 5} відповідатиме «HaHaHa», «HaHaHaHa» та «HaHaHaHaHa». Ви також можете пропустити перше або друге число у фігурних дужках, щоб залишити мінімум або максимум необмеженим. (Ha){3, } відповідатиме трьом або більше екземплярам групи (Ha), тоді як (Ha){, 5} відповідатиме від нуля до п’яти екземплярів. Фігурні дужки можуть допомогти зробити регулярні вирази коротшими.

Приклад 1: У цьому прикладі ми будемо використовувати фігурні дужки, щоб визначити появу шаблону, який ми шукаємо.

Python3




# Python program to illustrate> # Matching Specific Repetitions> # with Curly Brackets> import> re> haRegex>=> re.>compile>(r>'(Ha){3}'>)> mo1>=> haRegex.search(>'HaHaHa'>)> print>(mo1.group())>

>

>

Вихід:

HaHaHa>

приклад 2: У цьому прикладі ми визначимо появу шаблону за допомогою фігурних дужок, а потім з’ясуємо, чи існує в ньому певний шаблон.

Python3




# Python program to illustrate> # Matching Specific Repetitions> # with Curly Brackets> import> re> haRegex>=> re.>compile>(r>'(Ha){3}'>)> mo2>=> haRegex.search(>'Ha'>)>=>=> None> print>(mo2)>

>

>

Вихід:

True>

Додатковий оператор або знак питання (?) у регулярному виразі

Іноді є візерунок, який потрібно зіставити лише за бажанням. Тобто регулярний вираз має знайти збіг, незалежно від того, є цей фрагмент тексту чи ні. The ? символ позначає групу, яка йому передує, як необов’язкову частину шаблону.

Приклад 1: Тут ми будемо шукати візерунок із візерунком «Бетмен» або «Бетвумен». The (де)? частина регулярного виразу означає, що шаблон wo є необов’язковою групою. Регулярний вираз відповідатиме тексту, який містить нуль або один екземпляр wo. Ось чому регулярний вираз відповідає як «Batwoman», так і «Batman». Ви можете подумати про ? як кажуть, групи Відповідає нулю або одному з груп перед цим знаком питання.

Якщо вам потрібно знайти справжній знак питання, екрануйте його за допомогою ?.

Python3




# Python program to illustrate> # optional matching> # with question mark(?)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)?man'>)> mo1>=> batRegex.search(>'The Adventures of Batman'>)> mo2>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo1.group())> print>(mo2.group())>

>

>

Вихід:

Batman Batwoman>

Нуль або більше шаблонів зі зіркою

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

Приклад 1: У цьому прикладі ми зіставимо нульові випадки шаблону в рядку. Частина (wo)* регулярного виразу не відповідає нульовим випадкам wo в рядку.

Python3


xor cpp



# Python program to illustrate> # matching a regular expression> # with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo1>=> batRegex.search(>'The Adventures of Batman'>)> print>(mo1.group())>

>

>

Вихід:

Batman>

приклад 2: У цьому прикладі ми зіставимо принаймні один випадок шаблону в рядку.

Python




#python program to illustrate> #matching a regular expression> #with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo2>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo2.group())>

>

>

Вихід:

Batwoman>

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

Python




# Python program to illustrate> # matching a regular expression> # with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo3>=> batRegex.search(>'The Adventures of Batwowowowoman'>)> print>(mo3.group())>

>

>

Вихід:

Batwowowowoman>

Зіставлення одного або кількох шаблонів із плюсом

Поки * засоби відповідність нулю або більше , + (або плюс) означає відповідати одному або декільком. На відміну від зірочки, яка не вимагає, щоб її група з’являлася у відповідному рядку, група перед плюсом має з’являтися принаймні один раз. Це не обов'язково. Якщо вам потрібно зіставити справжній знак плюса, додайте перед знаком плюс зворотну скісну риску, щоб уникнути його: +.

Приклад 1: У цьому прикладі ми зіставимо принаймні один випадок шаблону в рядку.

Python3




# Python program to illustrate> # matching a regular expression> # with plus(+)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)+man'>)> mo1>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo1.group())>

>

>

Вихід:

Batwoman>

приклад 2: У цьому прикладі регулярний вираз Bat(wo)+man не відповідатиме рядку «Пригоди Бетмена», оскільки принаймні один wo вимагається знаком плюс.

алфавіт до числа

Python




# Python program to illustrate> # matching a regular expression> # with plus(+)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)+man'>)> mo3>=> batRegex.search(>'The Adventures of Batman'>)>=>=> None> print>(mo3)>

>

>

Вихід:

True>

Пов'язана стаття Regex Cheetsheet