Piton

Regularni izrazi pomoću Pythona 3

Regularni izrazi pomoću Pythona 3
Regularni izrazi često se doživljavaju kao ovaj doista nejasan niz hijeroglifa koje čovjek obično kopira s Interneta i zalijepi u svoj kod. Ova misteriozna čarolija tada pokazuje čarobne mogućnosti pronalaženja uzoraka unutar nizova teksta, a ako to lijepo zatražimo, učinit će nam čak i uslugu zamjene datog uzorka unutar niza nečim ljepšim.

Na primjer, kada pišete rukovatelje za URL (a Bog vam pomogao ako ih pišete ispočetka), tada često želite prikazati isti rezultat bez obzira na završno '/' u URL-u. E.g https: // primjer.com / user / settings / i https: // primjer.com / user / settings trebali bi usmjeriti na istu stranicu, unatoč završetku '/'. 

Međutim, ne možete zanemariti sve kose crte, poput:

  1. Kosa crta prema naprijed između "korisnik" i "postavke", e, "korisnik / postavke".
  2. Također ćete morati uzeti u obzir '//' na početku vašeg FQDN-a nakon čega slijedi 'https'.

Dakle, izmislili ste pravilo poput: „Zanemarite samo kose crte praćene praznim prostorom.”I ako želite možete to pravilo kodirati nizom if-else naredbi. Ali to će postati prilično glomazno. Možete napisati funkciju koja kaže cleanUrl () koja vam ovo može dodati. Ali svemir će uskoro početi bacati još loptica na vas. Uskoro ćete se naći za pisanje funkcija za cleanHeaders (), processLog () itd. Ili možete upotrijebiti regularni izraz kad god je potrebna bilo koja vrsta podudaranja uzorka.

Standardni IO i datoteke

Prije nego što uđemo u detalje regularnih izraza, vrijedi spomenuti model koji većina sustava ima za tijekove teksta. Evo kratkog (nepotpunog) sažetka toga:

  1. Tekst se obrađuje kao (jedan) tok znakova.
  2. Ovaj tok može potjecati iz datoteke s Unicode ili ASCII tekstom ili sa standardnog unosa (tipkovnica) ili s udaljene mrežne veze. Nakon obrade, recimo skriptom regularnog izraza, izlaz ili ide u datoteku ili mrežni tok ili standardni izlaz (npr.g, konzola)
  3. Potok se sastoji od jedne ili više linija. Svaki redak ima nula ili više znakova iza kojih slijedi novi redak.

Radi jednostavnosti, želim da zamislite da je datoteka sastavljena od redaka koji završavaju znakom novog retka. Dijelimo ovu datoteku na pojedinačne retke (ili nizove), a svaki završava s novim redom ili normalnim znakom (za zadnji redak).

Regeksi i nizovi

Regex nema nikakve posebne veze s datotekama. Zamislite ga kao crni okvir koji može uzeti kao ulaz bilo koji proizvoljni niz bilo koje (konačne) duljine, a nakon što stigne na kraj ovog niza može:

  1. Prihvatite niz. Drugim riječima, niz šibice regularni izraz (regularni izraz).
  2. Odbaci niz, tj.e, niz ne podudarnost regularni izraz (regularni izraz).

Unatoč svojoj prirodi crne kutije, dodat ću još nekoliko ograničenja ovoj strojnici. Redovni izraz čita niz sekvencijalno, slijeva nadesno i istovremeno čita samo jedan znak. Znači niz “LinuxHint” sa čitati kao:

'L "i" n "u" x "H" i "n" t' [slijeva udesno]

Krenimo jednostavno

Najjednostavnija vrsta regularnog izraza bila bi traženje i podudaranje niza 'C'. Regularni izraz za njega je samo "C". Sasvim trivijalno. Način na koji to možete učiniti u Pythonu zahtijevat će da prvo uvozite ponovno modul za regularne izraze.

>>> ponovni uvoz

Tada koristimo funkciju re.traži(uzorak, niz) gdje uzorak je naš redoviti izraz i niz u ulaznom nizu unutar kojeg tražimo uzorak.

>>> ponovno.search ('C', 'Ova rečenica sadrži namjerno C')

Funkcija uzima uzorak 'C', traži ga u ulaznom nizu i ispisuje mjesto (raspon) gdje se nalazi spomenuti obrazac. Ovaj dio niza, ovaj podniz je ono što odgovara našem regularnom izrazu. Da nije bilo takvog podudaranja, izlaz bi bio Nijedna objekt.

Slično tome, obrazac 'regularni izraz' možete tražiti na sljedeći način:

>>> ponovno.pretraživanje („regularni izraz“, „Za obrasce pretraživanja možemo koristiti regularne izraze.")

ponovno.traži (), ponovno.match () i re.puno podudaranje ()

Tri korisne funkcije modula re uključuju:

1.  ponovno.traži(uzorak, niz)

Ovo vraća natrag podniz koji odgovara uzorku, kao što smo vidjeli gore. Ako tada nije pronađeno podudaranje Nijedna se vraća. Ako se više podnizova podudara s danim uzorkom, prijavljuje se samo prvo pojavljivanje.

2.  ponovno.podudaranje (uzorak, niz)

Ova se funkcija pokušava podudarati s isporučenim uzorkom s početka niza. Ako negdje na pola puta naiđe na prekid, vraća se Nijedna.

Na primjer,

>>> ponovno.podudaranje ("Joh", "John Doe")

Gdje se kao niz "Zovem se John Doe" ne podudara, pa stoga Nijedna se vraća.

>>> ispis (re.podudaranje ("Joh", "Zovem se John Doe"))
Nijedna

3.  ponovno.puno podudaranje (uzorak, niz)

Ovo je strože od gore navedenog i pokušava pronaći točno podudaranje uzorka u nizu, inače je zadano Nijedna.

>>> ispis (re.puno podudaranje ("Joh", "Joh"))

# Ništa drugo neće biti podudarno

Koristit ću samo ponovno.traži() funkcija u ostatku ovog članka. Kad god kažem da regularni izraz prihvati ovaj niz, to znači da je athe ponovno.traži() funkcija je pronašla odgovarajući podniz u ulaznom nizu i vratila ga, umjesto Nijednaobjekt.

Posebni znakovi

Regularni izrazi poput "John" i "C" nisu od velike koristi. Potrebni su nam posebni znakovi koji specifično znače u kontekstu regularnih izraza. Evo nekoliko primjera:

    1. ^ - Ovo odgovara početku niza. Na primjer, '^ C' će odgovarati svim žicama koje počinju slovom C.
    2. $ - Ovo odgovara kraju retka.
    3. . - Točka označava jedan ili više znakova, osim novog retka.
    4. * - Ovo je nula ili više znakova onoga što je prethodilo. Dakle, b * odgovara 0 ili više pojavljivanja b. ab * odgovara samo a, ab i a
    5. + - Ovo se odnosi na jedan ili više znakova onoga što mu je prethodilo. Dakle, b + odgovara 1 ili više pojavljivanja b. ab * odgovara samo a, ab i a
    6. \ - Povratna crta koristi se kao redoslijed bijega u regularnim izrazima. Dakle, želite regularni izraz za traženje doslovne prisutnosti simbola dolara '$' umjesto kraja retka. \ $ Možete pisati regularnim izrazom.
    7. Kovrčane zagrade mogu se koristiti za određivanje broja ponavljanja koja želite vidjeti. Na primjer, uzorak poput ab 10 označava niz a nakon kojeg slijedi 10 b odgovarat će ovom uzorku. Možete odrediti i raspon brojeva, poput b 4,6 podudara se sa žicama koje sadrže b ponovljene 4 do 6 puta uzastopno. Uzorak za 4 ili više ponavljanja zahtijevao bi samo zarez, kao što je b 4,
    8. Uglate zagrade i raspon znakova. RE poput [0-9] može djelovati kao rezervirano mjesto za bilo koju znamenku između 0 i 9. Slično tome, možete imati znamenke između jedne i pet [1-5] ili podudarati se s bilo kojim velikim slovom [A-Z] ili bilo kojim slovom abecede, bez obzira na to je li velika ili mala (A-z).
      Na primjer, bilo koji niz od točno deset znamenki podudara se s regularnim izrazom [0-9] 10, vrlo korisno kada tražite telefonske brojeve u danom nizu.
    9. Možete stvoriti izjavu poput ILI pomoću | znak gdje se regularni izraz sastoji od dva ili više regularnih izraza, recimo, A i B. Redovni izraz A | B podudara se ako je ulazni niz podudaranje za regularni izraz A ili za B.
    10. Možete grupirati različite regularne izraze. Na primjer, regularni izraz (A | B) C podudarat će se s regularnim izrazima za AC i

Puno je još toga za pokriti, ali preporučio bih učenje dok idete, umjesto da preopteretite svoj mozak s puno nejasnih simbola i rubnih slučajeva. Kad sumnjate, Python dokumenti su od velike pomoći i sada znate dovoljno da ih lako slijedite.

Praktično iskustvo i reference

Ako želite vidjeti vizualnu interpretaciju vašeg regularnog izraza, možete posjetiti Debuggex. Ova web stranica generira prikaz vašeg regularnog izraza u stvarnom vremenu i omogućuje vam testiranje na različitim ulaznim nizovima.

Da biste saznali više o teorijskom aspektu Regularnih izraza, možda ćete htjeti pogledati prvih nekoliko poglavlja Uvoda u teoriju računanja Michaela Sipsera. Vrlo ga je lako pratiti i pokazuje važnost regularnih izraza kao temeljnog koncepta samog izračunavanja!

10 najboljih igara za igranje na Ubuntuu
Windows platforma bila je jedna od dominantnih platformi za igre zbog ogromnog postotka igara koje se danas razvijaju kako bi podržavale Windows. Može...
5 najboljih arkadnih igara za Linux
U današnje vrijeme računala su ozbiljni strojevi koji se koriste za igre na sreću. Ako ne uspijete dobiti novi visoki rezultat, znat ćete na što misli...
Bitka za Wesnoth 1.13.6 Razvoj objavljen
Bitka za Wesnoth 1.13.6 objavljeno prošlog mjeseca, šesto je razvojno izdanje u izdanju 1.13.x series i donosi niz poboljšanja, ponajviše korisničkog ...