Python

Регулярни изрази с помощта на Python 3

Регулярни изрази с помощта на Python 3
Регулярните изрази често се възприемат като тази наистина неясна поредица от йероглифи, които човек обикновено копира от Интернет и ги поставя в кода си. Тогава тази мистериозна магия показва магически възможности за намиране на шаблони в низове от текст и ако го попитаме добре, дори ще ни направи услугата да заменим даден шаблон в низ с нещо по-хубаво.

Например, когато пишете манипулатори за URL (и Бог да ви помогне, ако пишете такъв от нулата), тогава често искате да покажете един и същ резултат, независимо от крайното '/' в URL адреса. Е.g https: // пример.com / user / settings / и https: // пример.com / user / settings трябва и двете да сочат към една и съща страница, въпреки че в края на „/“. 

Не можете обаче да игнорирате всички наклонени черти, като:

  1. Наклонената черта между „потребител“ и „настройки“, д, „потребител / настройки“.
  2. Също така ще трябва да вземете предвид „//“ в началото на вашето FQDN, последвано от „https“.

И така, измисляте правило като: „Игнорирайте само наклонените линии напред, последвани от празно пространство.”И ако искате, можете да кодирате това правило с поредица от изрази if-else. Но това ще стане доста тромаво доста бързо. Можете да напишете функция, която казва cleanUrl (), която може да капсулира това за вас. Но Вселената скоро ще започне да ви хвърля повече криволичещи топки. Скоро ще откриете, че пишете функции за cleanHeaders (), processLog () и т.н. Или можете да използвате регулярен израз, когато се изисква някакъв вид съвпадение на шаблона.

Стандартен IO и файлове

Преди да влезем в детайлите на регулярните изрази, струва си да споменем модела, който повечето системи имат за текстови потоци. Ето кратко (непълно) обобщение на това:

  1. Текстът се обработва като (единичен) поток от символи.
  2. Този поток може да произхожда от файл с Unicode или ASCII текст или от стандартен вход (клавиатура) или от отдалечена мрежова връзка. След обработка, да речем чрез скрипт за регулярно изражение, изходът или отива във файл или мрежов поток или в стандартния изход (напр.g, конзола)
  3. Потокът се състои от една или повече линии. Всеки ред има нула или повече знака, последвани от нов ред.

За по-голяма простота искам да си представите, че файлът е съставен от редове, завършващи с нов ред. Разбиваме този файл на отделни редове (или низове), всеки завършващ или с нов ред, или с нормален знак (за последния ред).

Регулярни изрази и низ

Регексът няма нищо общо с файловете. Представете си го като черна кутия, която може да вземе като вход произволен низ с произволна (крайна) дължина и след като достигне края на този низ, може:

  1. Приемете низа. С други думи, низът мачове регулярният израз (регулярно изражение).
  2. Отхвърлете низа, т.е.д, низът не го прави съвпада регулярният израз (регулярно изражение).

Въпреки нейната черна природа, ще добавя още няколко ограничения към тази машинария. Regex чете низ последователно, отляво надясно и чете само по един знак наведнъж. Така че низ “LinuxHint” с да се чете като:

'L "i" n "u" x "H" i "n" t' [Отляво надясно]

Нека започнем просто

Най-опростеният тип регулярни изрази би бил да се търси и съчетава низ „C“. Регулярният израз за него е просто "C". Доста тривиално. Начинът да го направите в Python ще изисква първо да импортирате повторно модул за регулярни изрази.

>>> повторно импортиране

След това използваме функцията re.Търсене(модел, низ) където модел е нашият регулярен израз и низ във входния низ, в който търсим шаблона.

>>> повторно.search ('C', 'В това изречение има умишлено C')

Функцията приема шаблона "C", търси го във входния низ и отпечатва местоположението (span) където се намира споменатият модел. Тази част от низа, този подниз е това, което съответства на нашия регулярен израз. Ако нямаше такова съвпадение, намереният изход щеше да бъде Нито един обект.

По същия начин можете да търсите модела „регулярен израз“, както следва:

>>> повторно.търсене („регулярен израз“, „Можем да използваме регулярни изрази за модели на търсене.”)

повторно.търсене (), повторно.match () и re.пълно съвпадение ()

Три полезни функции от модула re включват:

1.  повторно.Търсене(модел, низ)

Това връща подниза, който съответства на модела, както видяхме по-горе. Ако тогава не бъде намерено съвпадение Нито един се връща. Ако множество поднизове отговарят на даден модел, се отчита само първото появяване.

2.  повторно.съвпада(модел, низ)

Тази функция се опитва да съответства на предоставения шаблон от началото на низа. Ако срещне прекъсване някъде по средата, той се връща Нито един.

Например,

>>> повторно.съвпадение ("Joh", "John Doe")

Където като низът „Казвам се Джон Доу“ не съвпада и следователно Нито един се връща.

>>> печат (повторно.съвпадение („Джон“, „Казвам се Джон Доу“))
Нито един

3.  повторно.пълно съвпадение (модел, низ)

Това е по-строго и от двете по-горе и се опитва да намери точно съвпадение на шаблона в низа, в противен случай по подразбиране е Нито един.

>>> печат (повторно.пълно съвпадение ("Joh", "Joh"))

# Всичко друго няма да е съвпадение

Ще използвам само повторно.Търсене() функция в останалата част на тази статия. Винаги, когато казвам, че регулярният израз приема този низ, това означава, че ате повторно.Търсене() функция е намерила съвпадащ подниз във входния низ и е върнала това, вместо Нито единобект.

Специални символи

Регулярните изрази като „Джон“ и „С“ не са много полезни. Нуждаем се от специални символи, които конкретно означават в контекста на регулярните изрази. Ето няколко примера:

    1. ^ - Това съвпада с началото на низ. Например '^ C' ще съответства на всички низове, които започват с буквата C.
    2. $ - Това съвпада с края на реда.
    3. . - Точката е за посочване на един или повече символи, с изключение на новия ред.
    4. * - Това е нула или повече знак от това, което го е предшествало. Така че b * съответства на 0 или повече случаи на b. ab * съвпада само с a, ab и a
    5. + - Това е за един или повече знаци от това, което го е предшествало. Така че b + съответства на 1 или повече случаи на b. ab * съвпада само с a, ab и a
    6. \ - обратната наклонена черта се използва като екранираща последователност в регулярните изрази. Така че искате редовен израз за търсене на буквалното присъствие на символа на долара '$' вместо края на реда. Можете да пишете \ $ в регулярен израз.
    7. Къдравите скоби могат да бъдат използвани за определяне на броя повторения, които искате да видите. Например модел като ab 10 означава низът a, последван от 10 b, ще съответства на този модел. Можете да посочите и диапазон от числа, като b 4,6 съответства на низове, съдържащи b, повторени 4 до 6 пъти последователно. Моделът за 4 или повече повторения ще изисква само последваща запетая, така b 4,
    8. Квадратни скоби и набор от символи. RE като [0-9] може да действа като заместител за всяка цифра между 0 и 9. По същия начин можете да имате цифри между една и пет [1-5] или да съответствате на която и да е главна буква, използвайте [A-Z] или за която и да е буква от азбуката, независимо дали е главна или малка буква [A-z].
      Например всеки низ, съставен от точно десет цифри, съответства на регулярния израз [0-9] 10, доста полезно, когато търсите телефонни номера в даден низ.
    9. Можете да създадете ИЛИ подобен израз, като използвате | символ, при който регулярен израз се състои от два или повече регулярни израза, да речем, A и B. Регулярният израз A | B е съвпадение, ако входният низ е или съвпадение за регулярния израз A или за B.
    10. Можете да групирате различни регулярни изрази заедно. Например, регулярният израз (A | B) C ще съответства на регулярните изрази за AC и

Има много други неща за покриване, но бих препоръчал да се учите по време на движение, вместо да претоварвате мозъка си с много неясни символи и крайни случаи. Когато се съмнявате, Документите на Python са от голяма помощ и сега знаете достатъчно, за да следвате документите лесно.

Практически опит и препоръки

Ако искате да видите визуална интерпретация на вашия регекс, можете да посетите Debuggex. Този сайт генерира изглед на вашия регулярен израз в реално време и ви позволява да го тествате срещу различни входни низове.

За да научите повече за теоретичния аспект на регулярните изрази, може да искате да разгледате първите няколко глави на Въведение в теорията на изчисленията от Майкъл Сипсер. Много лесно се проследява и показва важността на регулярните изрази като основна концепция на самото изчисление!

Как да изтеглите и пуснете Civilization VI на Сид Майер на Linux
Въведение в играта Civilization 6 е модерен поглед върху класическата концепция, въведена в поредицата от игрите Age of Empires. Идеята беше доста про...
Как да инсталирате и играете Doom на Linux
Въведение в Doom Серията Doom възниква през 90-те години след пускането на оригиналния Doom. Това беше незабавен хит и от този момент нататък серията ...
Vulkan за потребители на Linux
С всяко ново поколение графични карти виждаме, че разработчиците на игри преместват границите на графичната вярност и се приближават една крачка до фо...