Dokumentasjon for Re-modulen for Python 3 i . Re-modul for regulære uttrykk

Regulære uttrykk er en veldig populær komponent i nesten alle programmeringsspråk. De hjelper deg raskt å få tilgang til informasjonen du trenger. Spesielt brukes de når det er nødvendig å behandle tekst. Python kommer med en spesiell modul som standard. re, som er ansvarlig for å jobbe med regulære uttrykk.

I dag vil vi snakke i detalj om hva det er generelt, hvordan du jobber med dem og hvordan modulen re vil hjelpe.

Regelmessige uttrykk: en introduksjon

Hva er bruken av regulære uttrykk? Nesten alle. For eksempel disse:

  1. Webapplikasjoner som krever tekstvalidering. Et typisk eksempel er nettbaserte e-postklienter.
  2. Eventuelle andre prosjekter relatert til tekster, databaser og så videre.

Før vi begynner å analysere syntaksen, bør vi forstå mer detaljert de grunnleggende prinsippene for funksjonen til biblioteket re og generelt, hva er generelt bra med det. Vi vil også gi eksempler fra virkelig praksis, hvor vi vil beskrive mekanismen for deres bruk. Du kan lage en slik mal, egnet for deg å utføre en rekke operasjoner med tekst.

Hva er en mal i Re-biblioteket?

Med den kan du søke etter informasjon av ulike typer, få informasjon som tilsvarer dem, for å gjøre andre funksjoner mer tilpasningsdyktige. Og selvfølgelig å behandle disse dataene.

Ta for eksempel følgende mal: s+. Det betyr et hvilket som helst mellomromstegn. Hvis du legger til et plusstegn til det, betyr dette at mønsteret inneholder mer enn ett mellomrom. Den kan til og med matche tabulatortegn som kalles med t+.

Før du bruker dem, må du importere biblioteket Re. Etter det bruker vi en spesiell kommando for å kompilere malen. Dette gjøres i to trinn.

>>> import re

>>> regex = re.compile('s+')

Nærmere bestemt utfører denne koden operasjonen med å kompilere en mal som kan brukes. for eksempel for å søke etter mellomrom (ett eller flere).

Få separat informasjon fra forskjellige strenger ved hjelp av regulære uttrykk

Anta at vi har en variabel som inneholder følgende informasjon.

>>> tekst = “””100 INF Informatikk

213 MAT Matematikk  

156 ENG engelsk»»»

Den inneholder tre kurs. Hver av dem består av tre deler – nummer, kode og navn. Vi ser at intervallet mellom disse ordene er forskjellig. Hva skal jeg gjøre for å dele denne linjen i separate tall og ord? Det er to metoder for å nå dette målet:

  1. kalle opp en funksjon re.splitt.
  2. bruke funksjon splittet forum regex.

Her er et eksempel på bruk av syntaksen til hver av metodene for variabelen vår.

>>> re.split('s+', text)  

# eller

>>> regex.split(tekst)

Utdata: ['100', 'INF', 'Datavitenskap', '213', 'MAT', 'Math', '156', 'ENG', 'engelsk']

Generelt kan begge metodene brukes. Men det er faktisk mye enklere å bruke et regulært uttrykk i stedet for å bruke funksjonen flere ganger. re.splitt.

Finne matcher med tre funksjoner

La oss si at vi bare trenger å trekke ut tall fra en streng. Hva må gjøres for dette?

re.findall()

Her er en brukssituasjon for funksjonen finneall(), som sammen med regulære uttrykk lar deg trekke ut forekomster av ett eller flere tall fra en tekstvariabel.

>>> print (tekst)  

100 INF Informatikk

213 MAT Matematikk  

156 NOR Engelsk

>>> regex_num = re.compile('d+')  

>>> regex_num.findall(tekst)  

['100', '213', '156']

Sammen med d-symbolet brukte vi en mal som angir absolutt enhver numerisk verdi i en variabel eller tekst. Og siden vi la til en + der, betyr dette at minst ett tall må være til stede. 

Du kan også bruke *-tegnet for å spesifisere at tilstedeværelsen av et siffer ikke er nødvendig for at et samsvar skal bli funnet.

Men i vårt tilfelle, siden vi brukte +, ekstraherte vi med finneall() 1 eller flere digitale betegnelser på emner fra teksten. I vårt tilfelle fungerer derfor regulære uttrykk som innstillinger for funksjonen.

re.search() vs re.match()

Som du kan gjette ut fra navnet på funksjonene, søker den første etter et samsvar i teksten. Spørsmål: Hva er forskjellen mellom finne alt? Poenget er at det returnerer et spesifikt objekt som samsvarer med mønsteret, og ikke hele sekvensen av funne resultater i form av en liste, som den forrige funksjonen.

I sin tur gjør re.match-funksjonen det samme. Bare syntaksen er annerledes. Malen må plasseres i begynnelsen. 

La oss ta et eksempel som viser dette.

>>> # opprett en variabel med tekst

>>> text2 = «»»INF Informatikk

213 MAT Mathematics 156″»»  

>>> # kompiler regulært uttrykk og se etter mønstre

>>> regex_num = re.compile('d+')  

>>> s = regex_num.search(text2)  

>>> print('Første indeks: ', s.start())  

>>> print('Siste indeks: ', s.end())  

>>> print(tekst2[s.start():s.end()]) 

Første indeks: 17 

Siste indeks: 20

213

Hvis du ønsker å få et lignende resultat på en annen måte, kan du bruke funksjonen gruppe().

Erstatter en del av teksten med Re-bibliotek

For å erstatte tekst, bruk funksjonen re.sub(). Anta at vår liste over kurs har endret seg litt. Vi ser at etter hver digital verdi har vi en fane. Vår oppgave er å kombinere all denne sekvensen i én linje. For å gjøre dette må vi erstatte uttrykket s+ å passere 

Den opprinnelige teksten var:

# lag en variabel med tekst

>>> tekst = “””100 INF t Informatikk

213 MAT t Matte  

156 ENG t engelsk»»»  

>>> print (tekst)  

100 INFO informatikk

213 XNUMX XNUMX MAT matematikk  

156 ENG Engelsk

For å utføre ønsket operasjon brukte vi følgende kodelinjer.

# erstatt ett eller flere mellomrom med 1

>>> regex = re.compile('s+')  

>>> print(regex.sub(' ', tekst))  

Som et resultat har vi én linje. 

101 COM Datamaskiner 205 MAT Matematikk 189 ENG Engelsk

Vurder nå et annet problem. Vi står ikke overfor oppgaven med å sette mellomrom. Det er mye viktigere for oss at alle kursnavn starter på en ny linje. For å gjøre dette brukes et annet uttrykk som legger til en ny linje i unntaket. Hva slags uttrykk er dette?

Bibliotek Re støtter en funksjon som negativ samsvar. Den skiller seg fra den direkte ved at den inneholder et utropstegn før skråstreken. Det vil si at hvis vi må hoppe over linjeskifttegnet, må vi skrive !n i stedet for n.

Vi får følgende kode.

# fjern alle mellomrom unntatt ny linje  

>>> regex = re.compile('((?!n)s+)')  

>>> print(regex.sub(' ', tekst))  

100 INF Informatikk

213 MAT Matematikk  

156 NOR Engelsk

Hva er regulære uttrykksgrupper?

Ved hjelp av grupper av regulære uttrykk kan vi få de ønskede objektene i form av separate elementer, og ikke på én linje. 

Anta at vi trenger å få kursnummer, kode og navn ikke på én linje, men som separate elementer. For å fullføre oppgaven må du skrive et stort antall unødvendige kodelinjer. 

Faktisk kan oppgaven forenkles betraktelig. Du kan kompilere malen for alle oppføringer og bare spesifisere dataene du trenger å hente fra parentesene.

Det vil være et svært lite antall linjer. 

# lag grupper av kurstekstmaler og trekk dem ut

>>> course_pattern = '([0-9]+)s*([A-ZY]{3})s*([a-zA-ZoY]{4,})'  

>>> re.findall(kursmønster, tekst)  

[('100', 'INF', 'Datavitenskap'), ('213', 'MAT', 'Math'), ('156', 'ENG', 'engelsk')]

Konseptet med "grådig" matching

Som standard er regulære uttrykk programmert til å trekke ut den maksimale mengden samsvarende data. Og selv om du trenger mye mindre.

La oss se på et eksempel på en HTML-kode der vi trenger å hente taggen.

>>> text = "Eksempel på grådig matching av regulære uttrykk"  

>>> re.findall('', tekst)  

['Eksempel på grådig samsvar med regulære uttrykk']

I stedet for å trekke ut bare én tag, fikk Python hele strengen. Det er derfor det kalles grådig.

Og hva skal jeg gjøre for å få bare taggen? I dette tilfellet må du bruke lat matching. For å spesifisere et slikt uttrykk, legges et spørsmålstegn til på slutten av mønsteret.

Du vil få følgende kode og utdata fra tolken.

>>> re.findall('', tekst)  

[", "]

Hvis det er nødvendig å få kun den første forekomsten, brukes metoden Søk ().

re.search('', text).group()  

"

Da vil bare åpningstaggen bli funnet.

Populære uttrykksmaler

Her er en tabell som inneholder de mest brukte regulære uttrykksmønstrene.

Dokumentasjon for Re-modulen for Python 3 i . Re-modul for regulære uttrykk

konklusjonen

Vi har kun vurdert de mest grunnleggende metodene for å jobbe med regulære uttrykk. Du har i alle fall sett hvor viktige de er. Og her spiller det ingen rolle om det er nødvendig å analysere hele teksten eller dens individuelle fragmenter, om det er nødvendig å analysere et innlegg på et sosialt nettverk eller samle inn data for å behandle det senere. Regelmessige uttrykk er en pålitelig hjelper i denne saken.

De lar deg utføre oppgaver som:

  1. Spesifisere formatet på dataene, for eksempel en e-postadresse eller telefonnummer.
  2. Å få en streng og dele den i flere mindre strenger.
  3. Utfør ulike operasjoner med tekst, for eksempel å søke, trekke ut nødvendig informasjon eller erstatte deler av tegnene.

Regulære uttrykk lar deg også utføre ikke-trivielle operasjoner. Ved første øyekast er det ikke lett å mestre denne vitenskapen. Men i praksis er alt standardisert, så det er nok å finne ut av det en gang, hvoretter dette verktøyet kan brukes ikke bare i Python, men også i et hvilket som helst annet programmeringsspråk. Selv Excel bruker regulære uttrykk for å automatisere databehandling. Så det er synd å ikke bruke dette verktøyet.

Legg igjen en kommentar