Можливо, ви вже знайомі з пошуком тексту, натиснувши 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