Python

Vanlige uttrykk ved bruk av Python 3

Vanlige uttrykk ved bruk av Python 3
Regular Expressions blir ofte sett på som denne virkelig uklare serien med hieroglyfer som man vanligvis kopierer fra Internett og limer inn i hans / hennes kode. Denne mystiske magien viser da magiske muligheter for å finne mønstre i tekststrenger, og hvis vi spør det pent, vil det til og med gjøre oss til fordel for å erstatte et gitt mønster i en streng med noe bedre.

Når du for eksempel skriver håndterere for URL (og Gud hjelper deg hvis du skriver en fra bunnen av), vil du ofte vise det samme resultatet uavhengig av etterfølgende '/' i URL. E.g https: // eksempel.com / bruker / innstillinger / og https: // eksempel.com / bruker / innstillinger skal begge peke til samme side til tross for etterfølgende '/'. 

Du kan imidlertid ikke ignorere alle skråstrekkene, for eksempel:

  1. Forover skråstrek mellom 'bruker' og 'innstillinger', e, 'bruker / innstillinger'.
  2. Du må også ta hensyn til '//' i begynnelsen av FQDN fulgt av 'https'.

Så du kommer opp med en regel som, “Ignorer bare skråstrekkene fremover etterfulgt av tomt område.”Og hvis du vil, kan du kode den regelen med en serie if-else-utsagn. Men det vil bli tungvint ganske raskt. Du kan skrive en funksjon som sier cleanUrl () som kan kapsle inn dette for deg. Men universet vil snart begynne å kaste flere kurvekuler på deg. Du vil snart finne deg selv å skrive funksjoner for cleanHeaders (), processLog () osv. Eller du kan bruke et vanlig uttrykk når noen form for mønstermatching er nødvendig.

Standard IO og filer

Før vi kommer inn på detaljene i vanlige uttrykk, er det verdt å nevne modellen som de fleste systemer har for tekststrømmer. Her er en kort (ufullstendig) oppsummering av den:

  1. Tekst behandles som en (enkelt) strøm av tegn.
  2. Denne strømmen kan stamme fra en fil med Unicode- eller ASCII-tekst eller fra standardinngang (tastatur) eller fra en ekstern nettverkstilkobling. Etter behandling, for eksempel ved hjelp av et regex-skript, går utgangen enten til en fil eller nettverksstrøm eller standardutgangen (f.eks.g, konsoll)
  3. Strømmen består av en eller flere linjer. Hver linje har null eller flere tegn etterfulgt av en ny linje.

For enkelhets skyld vil jeg at du skal se for deg at en fil består av linjer som slutter med en ny linje. Vi deler denne filen i individuelle linjer (eller strenger) som hver ender med en ny linje eller et normalt tegn (for den siste linjen).

Regexs og streng

En regex har ingenting, spesielt, å gjøre med filer. Tenk deg det som en svart boks som kan ta som en hvilken som helst vilkårlig streng med en hvilken som helst (endelig) lengde, og når den når slutten av denne strengen, kan den enten:

  1. Godta strengen. Med andre ord, strengen fyrstikker det regulære uttrykket (regex).
  2. Avvis strengen, i.e, strengen gjør det ikke kamp det regulære uttrykket (regex).

Til tross for sin svarte boks-y natur, vil jeg legge til noen flere begrensninger for denne maskiningen. En regex leser en streng sekvensielt, fra venstre til høyre, og den leser bare ett tegn om gangen. Så en streng “LinuxHint” med leses som:

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

La oss starte enkelt

Den mest forenklede typen regex ville være å søke etter og matche en streng 'C'. Det vanlige uttrykket for det er bare 'C'. Ganske trivielt. Måten å gjøre det på Python vil kreve at du først importerer re modul for regulære uttrykk.

>>> importer re

Vi bruker deretter funksjonen re.Søk(mønster, snor) hvor mønster er vårt vanlige uttrykk og streng i inngangsstrengen der vi søker etter mønsteret.

>>> re.søk ('C', 'Denne setningen har en bevisst C i seg')

Funksjonen tar inn mønsteret 'C', ser etter det i inngangsstrengen og skriver ut plasseringen (span) hvor nevnte mønster er funnet. Denne delen av strengen, denne undergrunnen er det som samsvarer med vårt vanlige uttrykk. Hvis det ikke var noe slikt samsvar, ville produksjonen være en Ingen gjenstand.

På samme måte kan du søke etter mønsteret 'regulært uttrykk' som følger:

>>> re.søk (“regulært uttrykk”, “Vi kan bruke regulære uttrykk for å søke mønstre.”)

re.søk (), re.match () og re.fullmatch ()

Tre nyttige funksjoner fra re-modulen inkluderer:

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

Dette returnerer undergrunnen som samsvarer med mønsteret, som vi har sett ovenfor. Hvis ingen samsvar blir funnet da Ingen blir returnert. Hvis flere underlag er i samsvar med et gitt mønster, rapporteres bare den første forekomsten.

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

Denne funksjonen prøver å matche det medfølgende mønsteret fra begynnelsen av strengen. Hvis den støter på en pause et sted midtveis, kommer den tilbake Ingen.

For eksempel,

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

Hvor som strengen "Mitt navn er John Doe" ikke er en kamp, ​​og dermed Ingen blir returnert.

>>> utskrift (re.match ("Joh", "Mitt navn er John Doe"))
Ingen

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

Dette er strengere enn begge de ovennevnte, og prøver å finne en nøyaktig samsvar med mønsteret i strengen, ellers er Ingen.

>>> utskrift (re.fullmatch ("Joh", "Joh"))

# Alt annet vil ikke være en kamp

Jeg bruker bare re.Søk() funksjon i resten av denne artikkelen. Når jeg sier at regex godtar denne strengen, betyr det at athe re.Søk() funksjonen har funnet en matchende understreng i inngangsstrengen og returnert den, i stedet for Ingengjenstand.

Spesielle karakterer

Vanlige uttrykk som 'John' og 'C' er ikke til stor nytte. Vi trenger spesialtegn som et spesifikt betyr i sammenheng med regulære uttrykk. Her er noen eksempler:

    1. ^ - Dette samsvarer med begynnelsen på en streng. For eksempel vil '^ C' matche alle strengene som begynner med bokstaven C.
    2. $ - Dette samsvarer med slutten av linjen.
    3. . - Prikken skal indikere ett eller flere tegn, bortsett fra den nye linjen.
    4. * - Dette er til null eller mer av det som gikk foran det. Så b * samsvarer med 0 eller flere forekomster av b. ab * samsvarer bare med a, ab og a
    5. + - Dette er en eller flere karakterer av det som gikk foran det. Så b + samsvarer med 1 eller flere forekomster av b. ab * samsvarer bare med a, ab og a
    6. \ - Backslash brukes som escape-sekvens i regexene. Så det vil du ha et vanlig uttrykk for å søke etter bokstavelig tilstedeværelse av dollarsymbolet '$' i stedet for slutten av linjen. Du kan skrive \ $ i vanlig uttrykk.
    7. Krøllete bukseseler kan brukes til å spesifisere antall repetisjoner du vil se. Et mønster som ab 10 betyr for eksempel at strengen a etterfulgt av 10 b vil matche dette mønsteret. Du kan også angi et rekke tall, som b 4,6 samsvarer med strenger som inneholder b gjentatt 4 til 6 ganger etter hverandre. Mønsteret for 4 eller flere repetisjoner krever bare et etterfølgende komma, slik som b 4,
    8. Firkantede parenteser og tegnrekke. RE som [0-9] kan fungere som en plassholder for ethvert siffer mellom 0 og 9. På samme måte kan du ha sifre mellom en og fem [1-5] eller for å matche hvilken som helst stor bokstav bruk [A-Z] eller for en hvilken som helst bokstav i alfabetet, uavhengig av om det er store eller små bokstaver [A-z].
      For eksempel vil en streng laget med nøyaktig ti sifre matche det vanlige uttrykket [0-9] 10, ganske nyttig når du leter etter telefonnumre i en gitt streng.
    9. Du kan opprette en ELLER-lignende uttalelse ved hjelp av | karakter der et vanlig uttrykk består av to eller flere regulære uttrykk, si A og B. Regex A | B er et samsvar hvis inngangsstrengen enten er et samsvar for regulært uttrykk A eller for B.
    10. Du kan gruppere forskjellige regekser sammen. For eksempel vil regex (A | B) C matche regexes for AC og

Det er mye mer å dekke, men jeg vil anbefale å lære mens du går, i stedet for å overbelaste hjernen din med mange uklare symboler og kantsaker. Når du er i tvil, er Python Docs til stor hjelp, og nå vet du nok til å følge dokumentene enkelt.

Hands on Experience og referanser

Hvis du vil se en visuell tolkning av regexen din, kan du besøke Debuggex. Dette nettstedet genererer en oversikt over regexen din i sanntid, og lar deg teste den mot forskjellige inngangsstrenger.

Hvis du vil vite mer om det teoretiske aspektet ved Regular Expressions, kan det være lurt å se på de første par kapitlene i Introduksjon til Theory of Computation av Michael Sipser. Det er veldig enkelt å følge og viser viktigheten av regulære uttrykk som et kjernekonsept for beregning i seg selv!

Topp 5 spillfangstkort
Vi har alle sett og elsket streaming av spill på YouTube. PewDiePie, Jakesepticye og Markiplier er bare noen av de beste spillerne som har tjent milli...
Hvordan utvikle et spill på Linux
For et tiår siden ville ikke mange Linux-brukere forutsi at deres favorittoperativsystem en dag ville være en populær spillplattform for kommersielle ...
Åpne kildeporter for kommersielle spillmotorer
Gratis, åpen kildekode og plattformspillmotorrekreasjoner kan brukes til å spille gamle så vel som noen av de ganske nylige spilletitlene. Denne artik...