Python

Regular Expressions ved hjælp af Python 3

Regular Expressions ved hjælp af Python 3
Regulære udtryk ses ofte som denne virkelig uklare række hieroglyffer, som man typisk kopierer fra Internettet og indsætter i hans / hendes kode. Denne mystiske trylleformular viser derefter magiske muligheder for at finde mønstre inde i tekststrenge, og hvis vi spørger det pænt, vil det endda gøre os til fordel for at erstatte et givet mønster i en streng med noget pænere.

For eksempel, når du skriver håndterere til URL (og Gud hjælper dig, hvis du skriver en fra bunden), så vil du ofte vise det samme resultat uanset efterfølgende '/' i URL'en. E.g https: // eksempel.com / bruger / indstillinger / og https: // eksempel.com / bruger / indstillinger skal begge pege på den samme side på trods af den efterfølgende '/'. 

Du kan dog ikke ignorere alle skråstreg fremad som:

  1. Det skråstreg fremad mellem 'bruger' og 'indstillinger', e, 'bruger / indstillinger'.
  2. Du bliver også nødt til at tage højde for '//' i begyndelsen af ​​din FQDN efterfulgt af 'https'.

Så du kommer op med en regel som: ”Ignorer kun skråstreg fremad efterfulgt af tom plads.”Og hvis du vil, kan du kode denne regel med en række if-else-udsagn. Men det bliver besværligt hurtigt. Du kan skrive en funktion, der siger cleanUrl (), som kan indkapsle dette for dig. Men universet vil snart begynde at kaste flere kurvekugler på dig. Du vil snart finde dig selv at skrive funktioner til cleanHeaders (), processLog () osv. Eller du kan bruge et regulært udtryk, når der kræves nogen form for mønstermatchning.

Standard IO og filer

Før vi går i detaljer med regulære udtryk, er det værd at nævne den model, som de fleste systemer har til tekststrømme. Her er et kort (ufuldstændigt) resumé af det:

  1. Teksten behandles som en (enkelt) strøm af tegn.
  2. Denne stream kan stamme fra en fil med Unicode- eller ASCII-tekst eller fra standardinput (tastatur) eller fra en ekstern netværksforbindelse. Efter behandling, for eksempel ved hjælp af et regex-script, går output enten til en fil- eller netværksstrøm eller standardoutputtet (f.eks.g, konsol)
  3. Strømmen består af en eller flere linjer. Hver linje har nul eller flere tegn efterfulgt af en ny linje.

Af hensyn til enkelheden vil jeg have dig til at forestille dig, at en fil er sammensat af linjer, der slutter med en ny linjetegn. Vi deler denne fil i individuelle linjer (eller strenge), der hver slutter enten med en ny linje eller en normal karakter (for den sidste linje).

Regexs og streng

En regex har intet, specielt, at gøre med filer. Forestil dig det som en sort boks, der kan tage enhver vilkårlig streng af enhver (endelig) længde som input, og når den når slutningen af ​​denne streng, kan den enten:

  1. Accepter strengen. Med andre ord strengen Tændstikker det regulære udtryk (regex).
  2. Afvis strengen, i.e, strengen gør det ikke match det regulære udtryk (regex).

På trods af sin sorte boks-y-natur vil jeg tilføje nogle få begrænsninger til denne maskin. En regex læser en streng sekventielt, fra venstre til højre, og den læser kun et tegn ad gangen. Så en streng “LinuxHint” med læses som:

'L "i" n "u" x "H" i "n" t' [Venstre til højre]

Lad os starte simpelt

Den mest forenklede type regex ville være at søge efter og matche en streng 'C'. Det regulære udtryk for det er bare 'C'. Ganske trivielt. Måden at gøre det i Python kræver, at du først importerer re modul til regulære udtryk.

>>> import til

Vi bruger derefter funktionen re.Søg(mønster, snor) hvor mønster er vores faste udtryk og snor i inputstrengen, inden for hvilken vi søger efter mønsteret.

>>> om.søg ('C', 'Denne sætning har en bevidst C i sig')

Funktionen tager mønsteret 'C' ind, søger efter det i inputstrengen og udskriver placeringen (span) hvor nævnte mønster findes. Denne del af strengen, denne substring er det, der matcher vores regulære udtryk. Hvis der ikke var en sådan match, ville output være en Ingen objekt.

På samme måde kan du søge på mønsteret 'regulært udtryk' som følger:

>>> om.search (“regulært udtryk”, “Vi kan bruge regulære udtryk til søgemønstre.”)

re.søg (), gen.match () og re.fullmatch ()

Tre nyttige funktioner fra re-modulet inkluderer:

1.  re.Søg(mønster, snor)

Dette returnerer det underlag, der matcher mønsteret, som vi har set ovenfor. Hvis der ikke findes noget match, så Ingen returneres. Hvis flere underlag er i overensstemmelse med et givet mønster, rapporteres kun den første forekomst.

2.  re.match(mønster, snor)

Denne funktion forsøger at matche det leverede mønster fra begyndelsen af ​​strengen. Hvis den støder på en pause et sted midtvejs, vender den tilbage Ingen.

For eksempel,

>>> om.match ("Joh", "John Doe")

Hvor som strengen "Mit navn er John Doe" ikke er en match, og dermed Ingen returneres.

>>> udskriv (gent.match (“Joh”, “Mit navn er John Doe”))
Ingen

3.  re.fullmatch (mønster, snor)

Dette er strengere end begge ovenstående og forsøger at finde en nøjagtig matchning af mønsteret i strengen, ellers er standardværdien Ingen.

>>> udskriv (gent.fullmatch ("Joh", "Joh"))

# Alt andet vil ikke være en kamp

Jeg bruger netop re.Søg() funktion i resten af ​​denne artikel. Når jeg siger regex accepterer denne streng, betyder det at athe re.Søg() funktionen har fundet en matchende understreng i inputstrengen og returneret det i stedet for Ingenobjekt.

Særlige tegn

Regulære udtryk som 'John' og 'C' er ikke til stor nytte. Vi har brug for specialtegn, som et specifikt betyder i sammenhæng med regulære udtryk. Her er et par eksempler:

    1. ^ - Dette svarer til begyndelsen af ​​en streng. For eksempel vil '^ C' matche alle strengene, der begynder med bogstavet C.
    2. $ - Dette svarer til slutningen af ​​linjen.
    3. . - Prikken skal angive et eller flere tegn undtagen den nye linje.
    4. * - Dette er til nul eller flere tegn på det, der gik forud for det. Så b * matcher 0 eller flere forekomster af b. ab * matcher bare a, ab og a
    5. + - Dette er et eller flere tegn på, hvad der gik forud for det. Så b + matcher 1 eller flere forekomster af b. ab * matcher bare a, ab og a
    6. \ - Backslash bruges som escape-sekvens i regexes. Så det vil du have et regelmæssigt udtryk for at søge efter den bogstavelige tilstedeværelse af dollarsymbolet '$' i stedet for slutningen af ​​linjen. Du kan skrive \ $ i regulært udtryk.
    7. Krøllede seler kan bruges til at angive antallet af gentagelser, du vil se. For eksempel betyder et mønster som ab 10 strengen a efterfulgt af 10 b, der matcher dette mønster. Du kan også angive et række tal, som b 4,6 matcher strenge, der indeholder b gentaget 4 til 6 gange i træk. Mønsteret til 4 eller flere gentagelser kræver kun et efterfølgende komma, som f.eks. B 4,
    8. Firkantede parenteser og rækkevidde af tegn. RE som [0-9] kan fungere som en pladsholder for ethvert ciffer mellem 0 og 9. På samme måde kan du have cifre mellem en og fem [1-5] eller for at matche ethvert stort bogstav ved hjælp af [A-Z] eller til ethvert bogstav i alfabetet, uanset om det er store eller små bogstaver, brug [A-z].
      F.eks. Matcher enhver streng lavet med nøjagtigt ti cifre det regulære udtryk [0-9] 10, hvilket er ganske nyttigt, når du leder efter telefonnumre i en given streng.
    9. Du kan oprette en ELLER-lignende erklæring ved hjælp af | karakter, hvor et regulært udtryk består af to eller flere regulære udtryk, siger A og B. Regex A | B er et match, hvis inputstrengen enten er et match for regulært udtryk A eller for B.
    10. Du kan gruppere forskellige regexer sammen. For eksempel vil regex (A | B) C matche regexes for AC og

Der er meget mere at dække, men jeg vil anbefale at lære, mens du går, i stedet for at overbelaste din hjerne med mange obskure symboler og kantsager. I tvivlstilfælde er Python Docs en stor hjælp, og nu ved du nok til at følge docs let.

Hands on Experience og referencer

Hvis du vil se en visuel fortolkning af din regex, kan du besøge Debuggex. Dette websted genererer et overblik over din regex i realtid og lader dig teste det mod forskellige inputstrenge.

Hvis du vil vide mere om det teoretiske aspekt af Regular Expressions, kan du se på de første par kapitler i Introduktion til Theory of Computation af Michael Sipser. Det er meget let at følge og viser vigtigheden af ​​regulære udtryk som selve kernebegrebet i beregningen!

Mus Midterste museknap fungerer ikke i Windows 10
Midterste museknap fungerer ikke i Windows 10
Det midterste museknap hjælper dig med at rulle gennem lange websider og skærme med en masse data. Hvis det stopper, vil du ende med at bruge tastatur...
Mus Sådan ændres venstre og højre museknap på Windows 10-pc
Sådan ændres venstre og højre museknap på Windows 10-pc
Det er en ganske normal, at alle computermusenheder er ergonomisk designet til højrehåndede brugere. Men der er musenheder til rådighed, der er specie...
Mus Efterlig museklik ved at svæve ved hjælp af Clickless Mouse i Windows 10
Efterlig museklik ved at svæve ved hjælp af Clickless Mouse i Windows 10
Brug af en mus eller et tastatur i den forkerte kropsholdning af overdreven brug kan resultere i mange sundhedsmæssige problemer, herunder stamme, kar...