Python

Regularni izrazi z uporabo Pythona 3

Regularni izrazi z uporabo Pythona 3
Regularne izraze pogosto obravnavamo kot to res nejasno vrsto hieroglifov, ki jih običajno kopiramo iz interneta in jih prilepimo v svojo kodo. Ta skrivnostni urok nato pokaže čarobne zmožnosti iskanja vzorcev v nizih besedila in če ga lepo vprašamo, nam bo celo naredil uslugo, če bomo dani vzorec v nizu zamenjali z nečim lepšim.

Na primer, ko pišete vodnike za URL (in Bog vam pomaga, če pišete enega iz nič), pogosto želite prikazati enak rezultat, ne glede na končni znak '/' v URL-ju. E.g https: // primer.com / user / settings / in https: // primer.com / user / settings naj usmerjata na isto stran, kljub zaostanku '/'. 

Vendar ne morete prezreti vseh poševnic naprej, na primer:

  1. Poševnica naprej med 'uporabnik' in 'nastavitve', e, 'uporabnik / nastavitve'.
  2. Prav tako boste morali upoštevati '//' na začetku vašega FQDN, ki mu sledi 'https'.

Torej, prišli ste do pravila, kot je: »Prezri samo poševnice naprej, ki jim sledi prazen prostor."In če želite, lahko to pravilo kodirate z vrsto stavkov if-else. Toda to bo postalo okorno precej hitro. Lahko napišete funkcijo, ki pravi cleanUrl (), ki vam to lahko doda. Toda vesolje bo kmalu začelo metati v vas še več krogel. Kmalu se boste znašli pri pisanju funkcij za cleanHeaders (), processLog () itd. Lahko pa uporabite regularni izraz, kadar koli je potrebno kakršno koli ujemanje vzorcev.

Standardni IO in datoteke

Preden se spustimo v podrobnosti regularnih izrazov, je vredno omeniti model, ki ga ima večina sistemov za tokove besedila. Tu je kratek (nepopoln) njegov povzetek:

  1. Besedilo se obdeluje kot (en sam) tok znakov.
  2. Ta tok lahko izvira iz datoteke z besedilom Unicode ali ASCII ali iz običajnega vnosa (tipkovnica) ali iz oddaljene omrežne povezave. Po obdelavi, recimo s skriptom regularnega izraza, gre izhod v datoteko ali omrežni tok ali standardni izhod (npr.g, konzola)
  3. Tok vsebuje eno ali več vrstic. Vsaka vrstica ima nič ali več znakov, čemur sledi nova vrstica.

Zaradi poenostavitve si predstavljam, da je datoteka sestavljena iz vrstic, ki se končajo z znakom nove vrstice. Datoteko razbijemo na posamezne vrstice (ali nize), ki se končajo z novo vrstico ali običajnim znakom (za zadnjo vrstico).

Redovni izrazi in niz

Redovni izraz nima nič skupnega z datotekami. Predstavljajte si ga kot črno polje, ki lahko sprejme kot poljuben poljuben poljuben niz poljubne (končne) dolžine in ko doseže konec tega niza, lahko:

  1. Sprejmi niz. Z drugimi besedami, niz tekme regularni izraz (regularni izraz).
  2. Zavrni niz, tj.e, niz ne tekmo regularni izraz (regularni izraz).

Kljub svoji črni škatli bom tej strojnici dodal še nekaj omejitev. Regex bere niz zaporedoma, od leve proti desni in naenkrat bere samo en znak. Torej niz “LinuxHint” z beri kot:

'L "i" n "u" x "H" i "n" t' [od leve proti desni]

Začnimo preprosto

Najbolj poenostavljena vrsta regularnega izraza bi bila iskanje in ujemanje niza 'C'. Regularni izraz zanj je samo "C". Precej nepomembno. Če želite to narediti v Pythonu, morate najprej uvoziti datoteko ponovno modul za regularne izraze.

>>> ponovni uvoz

Nato uporabimo funkcijo re.Iskanje(vzorec, niz) kje vzorec je naš regularni izraz in vrvica v vhodnem nizu, znotraj katerega iščemo vzorec.

>>> ponovno.search ('C', 'Ta stavek vsebuje namerno C')

Funkcija zavzame vzorec 'C', ga poišče v vhodnem nizu in natisne lokacijo (razpon) kjer je omenjeni vzorec. Ta del niza, ta podniz je tisti, ki se ujema z našim regularnim izrazom. Če takega ujemanja ne bi bilo, bi bil izhodni rezultat Nobenega predmet.

Podobno lahko poiščete vzorec „regularni izraz“, kot sledi:

>>> ponovno.iskanje (»regularni izraz«, »Za iskanje vzorcev lahko uporabimo regularne izraze.")

ponovno.iskanje (), ponovno.match () in re.polno ujemanje ()

Tri uporabne funkcije modula re vključujejo:

1.  ponovno.Iskanje(vzorec, niz)

To vrne podniz, ki se ujema z vzorcem, kot smo videli zgoraj. Če ujemanja ne najdemo Nobenega se vrne. Če se več podnizov ujema z določenim vzorcem, se poroča le o prvi pojavitvi.

2.  ponovno.ujemanje (vzorec, niz)

Ta funkcija se poskuša ujemati s priloženim vzorcem z začetka niza. Če nekje na sredini naleti na odmor, se vrne Nobenega.

Na primer,

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

Kjer se kot niz »Moje ime je John Doe« ne ujema, torej Nobenega se vrne.

>>> natisni (ponov.ujemanje (»Joh«, »Moje ime je John Doe«))
Nobenega

3.  ponovno.polno ujemanje (vzorec, niz)

To je strožje od zgoraj navedenega in poskuša najti natančno ujemanje vzorca v nizu, sicer je privzeto Nobenega.

>>> natisni (ponov.celotno ujemanje ("Joh", "Joh"))

# Vse drugo se ne bo ujemalo

Uporabil bom samo ponovno.Iskanje() v preostalem delu tega članka. Kadarkoli rečem, da regularni izraz sprejme ta niz, to pomeni, da athe ponovno.Iskanje() funkcija je v vhodnem nizu našla ujemajoč se podniz in ga vrnila namesto Nobenegapredmet.

Posebni znaki

Regularni izrazi, kot sta "John" in "C", niso preveč koristni. Potrebujemo posebne znake, ki pomenijo določeno v kontekstu regularnih izrazov. Tu je nekaj primerov:

    1. ^ - To se ujema z začetkom niza. Na primer, '^ C' se bo ujemal z vsemi nizi, ki se začnejo s črko C.
    2. $ - Ujema se s koncem vrstice.
    3. . - Pika označuje enega ali več znakov, razen nove vrstice.
    4. * - To pomeni nič ali več znakov pred tem. Torej se b * ujema z 0 ali več pojavitvami b. ab * se ujema samo z a, ab in a
    5. + - To velja za enega ali več znakov predhodnega. Torej b + ustreza 1 ali več pojavitvam b. ab * se ujema samo z a, ab in a
    6. \ - povratna poševnica se uporablja kot ubežno zaporedje v regularnih izrazih. Torej želite regularni izraz za iskanje dobesedne prisotnosti dolarskega simbola '$' namesto konca vrstice. \ $ Lahko pišete v regularnem izrazu.
    7. S skodranimi oklepaji lahko določite število ponovitev, ki jih želite videti. Na primer, vzorec, kot je ab 10, pomeni, da se temu vzorcu ujema niz a, ki mu sledi 10 b. Določite lahko tudi obseg številk, na primer b 4,6 se ujema z nizi, ki vsebujejo b, ki se ponavlja 4 do 6 krat zapored. Vzorec za 4 ali več ponovitev bi zahteval samo zadnjo vejico, na primer b 4,
    8. Oglati oklepaji in obseg znakov. RE kot [0-9] lahko deluje kot ograda za katero koli številko med 0 in 9. Podobno lahko imate števke med eno in peto [1-5] ali pa se ujemate s katero koli veliko črko z uporabo [A-Z] ali za katero koli črko abecede, ne glede na to, ali gre za veliko ali malo [A-z].
      Na primer, kateri koli niz, sestavljen iz natančno desetih števk, se ujema z regularnim izrazom [0-9] 10, kar je zelo koristno, če iščete telefonske številke v danem nizu.
    9. Izdelate lahko podobno izjavo ALI z uporabo | znak, kjer je regularni izraz sestavljen iz dveh ali več regularnih izrazov, recimo A in B. Redovni izraz A | B se ujema, če se vhodni niz ujema z regularnim izrazom A ali z B.
    10. Različne regularne izraze lahko združite v skupine. Na primer, regularni izraz (A | B) C se bo ujemal z regularnimi izrazi za AC in

Pokriti je še veliko več, vendar bi priporočal učenje med potekom, namesto da bi svoje možgane preobremenili z veliko nejasnih simbolov in robnih primerov. Če ste v dvomih, so Python Docs v veliko pomoč in zdaj veste dovolj, da jih lahko preprosto spremljate.

Izkušnje in reference

Če želite videti vizualno interpretacijo svojega regularnega izraza, lahko obiščete Debuggex. To spletno mesto ustvari pogled vašega regularnega izraza v realnem času in vam omogoča, da ga preizkusite glede na različne vhodne nize.

Če želite izvedeti več o teoretičnem vidiku regularnih izrazov, si boste morda želeli ogledati prvih nekaj poglavij Uvoda v teorijo računanja Michaela Sipserja. Zelo enostavno mu je slediti in kaže na pomen regularnih izrazov kot temeljnega koncepta samega računanja!

Brezplačni in odprtokodni igralni mehanizmi za razvoj iger Linux
Ta članek bo zajemal seznam brezplačnih in odprtokodnih igralnih mehanizmov, ki jih je mogoče uporabiti za razvoj 2D in 3D iger v Linuxu. Obstaja veli...
Vadnica Shadow of the Tomb Raider za Linux
Shadow of the Tomb Raider je dvanajsti dodatek k seriji Tomb Raider - franšiza akcijsko-pustolovskih iger, ki jo je ustvaril Eidos Montreal. Kritiki i...
Kako povečati FPS v Linuxu?
FPS pomeni Število sličic na sekundo. Naloga FPS je merjenje hitrosti sličic pri predvajanju video posnetkov ali igranih predstavah. Z enostavnimi bes...