Pytonorm

Regular Expressions med Python 3

Regular Expressions med Python 3
Regular Expressions ses ofta som denna riktigt dunkla serie hieroglyfer som man vanligtvis kopierar från Internet och klistrar in i sin kod. Denna mystiska förtrollning visar sedan magiska möjligheter att hitta mönster i textsträngar och om vi frågar det snyggt kommer det till och med att göra oss för att ersätta ett visst mönster i en sträng med något trevligare.

När du till exempel skriver hanterare för URL (och Gud hjälper dig om du skriver en från grunden) vill du ofta visa samma resultat oavsett efterföljande '/' i URL: en. E.g https: // exempel.com / user / settings / och https: // exempel.com / användare / inställningar ska båda peka på samma sida trots efterföljande '/'. 

Du kan dock inte ignorera alla snedstreck framåt, som:

  1. Snedstrecket framåt mellan 'användare' och 'inställningar', e, 'användare / inställningar'.
  2. Du måste också ta hänsyn till '//' i början av din FQDN följt av 'https'.

Så du kommer fram till en regel som ”Ignorera bara snedstreck framåt följt av tomt utrymme.”Och om du vill kan du koda den regeln med en serie if-else-uttalanden. Men det kommer att bli besvärligt ganska snabbt. Du kan skriva en funktion som säger cleanUrl () som kan inkapsla detta åt dig. Men universum kommer snart att kasta fler kurvbollar på dig. Snart kommer du att skriva funktioner för cleanHeaders (), processLog () osv. Eller så kan du använda ett reguljärt uttryck när någon form av mönstermatchning krävs.

Standard IO och filer

Innan vi går in på detaljerna i reguljära uttryck är det värt att nämna den modell som de flesta system har för textströmmar. Här är en kort (ofullständig) sammanfattning av den:

  1. Text bearbetas som en (enstaka) ström av tecken.
  2. Den här strömmen kan komma från en fil med Unicode- eller ASCII-text eller från standardingång (tangentbord) eller från en fjärransluten nätverksanslutning. Efter bearbetning, säg med ett regex-skript, går utgången antingen till en fil- eller nätverksström eller standardutmatningen (t.ex.g, konsol)
  3. Strömmen består av en eller flera rader. Varje rad har noll eller fler tecken följt av en ny rad.

För enkelhetens skull vill jag att du ska föreställa dig att en fil består av rader som slutar med en nylinjetecken. Vi delar upp den här filen i enskilda rader (eller strängar), var och en slutar antingen med en ny linje eller en normal karaktär (för den sista raden).

Regex och sträng

En regex har inget särskilt att göra med filer. Föreställ dig det som en svart ruta som kan ta som ingång vilken godtycklig sträng som helst (ändlig) längd och när den når slutet av den här strängen kan den antingen:

  1. Acceptera strängen. Med andra ord strängen tändstickor det reguljära uttrycket (regex).
  2. Avvisa strängen, jag.e, strängen gör det inte match det reguljära uttrycket (regex).

Trots sin svarta box-y-natur kommer jag att lägga till några fler begränsningar för denna maskin. En regex läser en sträng sekventiellt, från vänster till höger, och den läser bara en karaktär åt gången. Så en sträng “LinuxHint” med läsas som:

'L "i" n "u" x "H" i "n" t' [Vänster till höger]

Låt oss börja enkelt

Den mest förenklade typen av regex skulle vara att söka efter och matcha en sträng 'C'. Det vanliga uttrycket för det är bara 'C'. Ganska trivialt. Sättet att göra det i Python kräver att du först importerar re modul för reguljära uttryck.

>>> importera om

Vi använder sedan funktionen re.Sök(mönster, sträng) var mönster är vårt vanliga uttryck och sträng i inmatningssträngen inom vilken vi söker efter mönstret.

>>> om.sök ('C', 'Denna mening har en avsiktlig C i sig')

Funktionen tar in mönstret 'C', letar efter det i inmatningssträngen och skriver ut platsen (span) där nämnda mönster finns. Denna del av strängen, den här strängen är det som matchar vårt vanliga uttryck. Om det inte fanns någon sådan matchning skulle resultatet vara a Ingen objekt.

På samma sätt kan du söka efter mönstret "reguljärt uttryck" enligt följande:

>>> re.search ("reguljärt uttryck", "Vi kan använda reguljära uttryck för att söka mönster.”)

re.sök (), re.match () och re.hel match()

Tre användbara funktioner från re-modulen inkluderar:

1.  re.Sök(mönster, sträng)

Detta returnerar underlaget som matchar mönstret, som vi har sett ovan. Om ingen matchning hittas då Ingen returneras. Om flera underlag överensstämmer med ett visst mönster rapporteras endast den första förekomsten.

2.  re.match(mönster, sträng)

Denna funktion försöker matcha det medföljande mönstret från strängens början. Om den stöter på en paus någonstans halvvägs, återvänder den Ingen.

Till exempel,

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

Var som strängen "Mitt namn är John Doe" är inte en matchning, och därmed Ingen returneras.

>>> skriva ut (om.match ("Joh", "Mitt namn är John Doe"))
Ingen

3.  re.hel match(mönster, sträng)

Detta är strängare än både ovan och försöker hitta en exakt matchning av mönstret i strängen, annars är Ingen.

>>> skriva ut (om.fullmatch ("Joh", "Joh"))

# Allt annat kommer inte att matcha

Jag använder bara re.Sök() funktion i resten av den här artikeln. Närhelst jag säger att regex accepterar den här strängen betyder det att athe re.Sök() funktionen har hittat ett matchande underlag i inmatningssträngen och returnerat det istället för Ingenobjekt.

Speciella karaktärer

Vanliga uttryck som "John" och "C" är inte till stor nytta. Vi behöver specialtecken som ett specifikt betyder i samband med reguljära uttryck. Här är några exempel:

    1. ^ - Detta matchar början på en sträng. Till exempel kommer '^ C' att matcha alla strängar som börjar med bokstaven C.
    2. $ - Detta matchar slutet på raden.
    3. . - Pricken är att ange ett eller flera tecken, utom den nya raden.
    4. * - Detta är noll eller mer än vad som föregick det. Så b * matchar 0 eller fler förekomster av b. ab * matchar bara a, ab och a
    5. + - Detta är en eller flera karaktärer av det som föregick det. Så b + matchar 1 eller flera förekomster av b. ab * matchar bara a, ab och a
    6. \ - Backslash används som escape-sekvens i regexerna. Så det vill du ha ett regelbundet uttryck för att söka efter bokstavlig närvaro av dollarsymbolen '$' istället för slutet på raden. Du kan skriva \ $ i reguljärt uttryck.
    7. Lockiga hängslen kan användas för att ange antalet repetitioner som du vill se. Till exempel, ett mönster som ab 10 betyder strängen a följt av 10 b kommer att matcha detta mönster. Du kan också ange ett antal siffror, som b 4,6 matchar strängar som innehåller b upprepas 4 till 6 gånger i följd. Mönstret för fyra eller flera repetitioner kräver bara ett efterföljande komma, som så b 4,
    8. Fyrkantiga parenteser och teckenintervall. RE som [0-9] kan fungera som en platshållare för vilken siffra som helst mellan 0 och 9. På samma sätt kan du ha siffror mellan en och fem [1-5] eller för att matcha valfri versaler [A-Z] eller för valfri bokstav i alfabetet, oavsett om det är gemener eller gemener [A-z].
      Till exempel valfri sträng med exakt tio siffror matchar det reguljära uttrycket [0-9] 10, ganska användbart när du letar efter telefonnummer i en viss sträng.
    9. Du kan skapa ett ELLER-uttalande med | karaktär där ett reguljärt uttryck består av två eller flera reguljära uttryck, säg A och B. Regex A | B är en matchning om ingångssträngen antingen är en matchning för reguljärt uttryck A eller för B.
    10. Du kan gruppera olika regexer tillsammans. Till exempel kommer regex (A | B) C att matcha regexes för AC och

Det finns mycket mer att täcka, men jag rekommenderar att du lär dig när du går istället för att överbelasta din hjärna med många dunkla symboler och kantfall. När du är osäker är Python Docs till stor hjälp och nu vet du tillräckligt för att enkelt följa dokumenten.

Hands on Experience och referenser

Om du vill se en visuell tolkning av din regex kan du besöka Debuggex. Denna webbplats genererar en vy av din regex i realtid och låter dig testa den mot olika inmatningssträngar.

Om du vill veta mer om den teoretiska aspekten av Regular Expressions kanske du vill titta på de första par kapitlen i Introduction to Theory of Computation av Michael Sipser. Det är väldigt lätt att följa och visar vikten av reguljära uttryck som ett kärnkoncept för själva beräkningen!

Mus AppyMouse styrplatta och muspekare för Windows-surfplattor
AppyMouse styrplatta och muspekare för Windows-surfplattor
Surfplattanvändare saknar ofta muspekaren, särskilt när de brukar använda bärbara datorer. Pekskärmen Smartphones och surfplattor har många fördelar o...
Mus Mellan musknappen fungerar inte i Windows 10
Mellan musknappen fungerar inte i Windows 10
De mittknappen hjälper dig att bläddra igenom långa webbsidor och skärmar med mycket data. Om det slutar, kommer du sluta använda tangentbordet för at...
Mus Hur man ändrar vänster och höger musknapp på Windows 10 PC
Hur man ändrar vänster och höger musknapp på Windows 10 PC
Det är en hel norm att alla datormusenheter är ergonomiskt utformade för högerhänta användare. Men det finns musenheter tillgängliga som är speciellt ...