Vanlige uttrykk i Python

Har du noen gang lurt på hva nøkkelen er til funn litt tekst i et dokument, eller sørg for at en tekst I overensstemmelse til noen formater, for eksempel en e-postadresse og andre lignende operasjoner?

Nøkkelen til slike operasjoner er regulære uttrykk (regex). La oss se noen definisjoner for regulære uttrykk. I Wikipedia er regex definert som følger:

En sekvens av tegn som definerer et søkemønster, hovedsakelig for bruk i mønster som samsvarer med strenger, eller streng matching, dvs. "finne og erstatte" -like operasjoner. Konseptet oppsto på 1950-tallet, da den amerikanske matematikeren Stephen Kleene formaliserte beskrivelsen av et vanlig språk og kom til felles bruk med Unix tekstbehandlingsverktøyene ed, en redaktør og grep, et filter.

En annen fin definisjon fra regular-expressions.info er:

Et vanlig uttrykk (regex eller regexp for kort) er en spesiell tekststreng for å beskrive et søkemønster. Du kan tenke på vanlige uttrykk som jokertegn på steroider. Du er sikkert kjent med jokertegn, for eksempel * .txt, for å finne alle tekstfiler i en filbehandling. Regex-ekvivalenten er. * \. Txt $

Jeg vet at begrepet regulære uttrykk fortsatt kan høres litt vakt ut. Så, la oss se på noen eksempler på regex for å forstå konseptet bedre.

Eksempler på regelmessige uttrykk

I denne delen vil jeg vise deg noen eksempler på regex for å hjelpe deg med å forstå konseptet ytterligere.

Si at du hadde denne regexen:

/ Abder /

Dette er bare å fortelle oss om å matche ordet abder bare.

Hva med denne regexen?

/ A [nr] t /

Du kan lese denne regexen som følger: Finn et tekstmønster slik at det første bokstaven er en og den siste bokstaven er t, og mellom disse bokstavene kommer heller n eller r. Så de matchende ordene er maur og Kunst.

La meg gi deg en liten quiz på dette punktet. Hvordan ville du skrive et vanlig uttrykk som starter med ca, og slutter med en eller alle de følgende tegnene TBR? Ja, denne regexen kan skrives som følger:

/ Ca [TBR] /

Hvis du ser en regex som starter med en circumflex-aksent ^, dette betyr at du stemmer overens med strengen som begynner med strengen som er nevnt etter ^. Så, hvis du hadde regexen nedenfor, matcher den strengen som begynner med Dette.

/ ^ Dette /

Dermed i følgende streng:

Mitt navn er Abder Dette er Abder Dette er Tom

Basert på regex / ^ Dette /, Følgende strenger vil bli matchet:

Dette er Abder Dette er Tom

Hva om vi ønsket å matche en streng som endene med litt streng? I dette tilfellet bruker vi dollartegnet $. Her er et eksempel:

Abder $

Dermed i de ovennevnte strengene (de tre linjene), vil følgende mønstre bli matchet ved å bruke denne regexen:

Mitt navn er Abder Dette er Abder

Vel, hva synes du om denne regexen??

^ [A-Z] [a-z]

Jeg vet at det kan virke komplekst ved første øyekast, men la oss gå gjennom det stykke for hverandre.

Vi så allerede hva en circumflex aksent ^ er. Det betyr å matche en streng som starter med litt streng. [A-Z] refererer til store bokstaver. Så, hvis vi leser denne delen av regexen: ^ [A-Z], det forteller oss å matche strengen som begynner med en stor bokstav. Den siste delen, [A-z], betyr at etter å ha funnet en streng som starter med en stor bokstav, vil den bli etterfulgt av små bokstaver fra alfabetet.

Så, hvilken av de følgende strengene vil bli matchet ved hjelp av denne regexen? Hvis du ikke er sikker, kan du bruke Python som vi vil se i neste avsnitt for å teste svaret ditt.

Abder Abder ABDER ABder

Regelmessige uttrykk er et meget bredt tema, og disse eksemplene er bare for å gi deg en følelse av hva de er og hvorfor vi bruker dem. 

En fin referanse for å lære mer om vanlige uttrykk og se flere eksempler er RexEgg.

Vanlige uttrykk i Python

La oss nå komme til den morsomme delen. Vi vil se hvordan du arbeider med noen av de ovennevnte regulære uttrykkene i Python. Modulen vi skal bruke til å arbeide med regulære uttrykk i Python er re modul.

Det første eksemplet handlet om å finne ordet abder. I Python ville vi gjøre dette på følgende måte:

import re text = 'Mitt navn er Abder' match_pattern = re.match (r'Abder ', tekst) print match_pattern

Hvis du kjører det ovennevnte Python-skriptet, får du utgangen: Ingen!

Skriptet fungerer fint, men problemet er med hvordan funksjonen kamp() virker. Hvis vi kommer tilbake til re modul dokumentasjon, dette er hva funksjonen kamp() gjør:

Hvis null eller flere tegn i begynnelsen av strengen samsvarer med det vanlige uttrykksmønsteret, returner du et tilsvarende samsvarobjekt. Retur Ingen hvis strengen ikke samsvarer med mønsteret; Legg merke til at dette er forskjellig fra en nulllengde-kamp.

Aha, fra dette kan vi se det kamp() vil returnere et resultat bare hvis det fant en kamp på begynnelse av strengen.

Vi kan i stedet bruke funksjonen Søke(), som er basert på dokumentasjonen:

Skann gjennom streng på jakt etter den første plasseringen der det vanlige uttrykksmønsteret produserer en kamp, ​​og returner et tilsvarende kampobjekt. Retur Ingen hvis ingen posisjon i strengen samsvarer med mønsteret; Legg merke til at dette er forskjellig fra å finne en nulllengdesammenstilling på et tidspunkt i strengen.

Så, hvis vi skriver dette scriptet, men med Søke() i stedet for kamp(), vi får følgende utgang:

<_sre.SRE_Match object at 0x101cfc988>

Det er en match objektet har blitt returnert.

Hvis vi ønsker å returnere resultatet (strengkamp), bruker vi gruppe() funksjon. Hvis vi ønsker å se hele kampen, bruker vi gruppe (0). Og dermed:

skriv ut match_pattern.group (0)

vil returnere utgangen: Abder.

Hvis vi tar den andre regexen i forrige del, er det / A [nr] t /, det kan skrives i python som følger:

import re text = 'Dette er en svart myr' match_pattern = re.search (r'a [nr] t ', tekst) print match_pattern.group (0)

Utgangen for dette skriptet er: maur.

Konklusjon

Artikkelen blir lengre, og temaet for vanlige uttrykk i Python tar sikkert mer enn en artikkel, om ikke en bok av seg selv. 

Denne artikkelen er imidlertid å gi deg en rask start og trygghet for å komme inn i verden med vanlige uttrykk i Python. Du kan referere til re dokumentasjon for å lære mer om denne modulen og hvordan du går dypere i emnet.