Du kanske är bekant med att söka efter text genom att trycka på ctrl-F och skriva in orden du letar efter. Reguljära uttryck går ett steg längre: De låter dig ange ett textmönster att söka efter. I den här artikeln kommer vi att se hur mönstermatchning i Python fungerar med Regex.
Regex i Python
Vanliga uttryck , även kallad regex , är beskrivningar av ett textmönster. Den kan upptäcka närvaron eller frånvaron av en text genom att matcha den med ett visst mönster och kan också dela upp ett mönster i ett eller flera undermönster. Till exempel, en d i ett regex står för ett siffertecken - det vill säga varje enskild siffra mellan 0 och 9.
Kontrollera telefonnummer med hjälp av Regex i Python
Följande regex används i Pytonorm för att matcha en sträng med tre siffror, ett bindestreck, ytterligare tre siffror, ett annat bindestreck och fyra siffror.
Any other string would not match the pattern. ddd-ddd-dddd>
Reguljära uttryck kan vara mycket mer sofistikerade. Att till exempel lägga till en 3:a inom parentes ({3}) efter ett mönster är som att säga, Matcha detta mönster tre gånger. Så det något kortare regexet är som följer:
oj i java
d{3}-d{3}-d{4}> Det matchar det korrekta telefonnummerformatet.
Mönstermatchning med reguljära uttryck
Ett Regex-objekt Sök() metoden söker i strängen den skickas efter eventuella matchningar till det regex. Matcha objekt har en group()-metod som returnerar den faktiska matchade texten från den sökta strängen. Du kan också seRegex cheetsheetför mer information.
Exempel: Importera regex-modulen med import re. Skapa ett Regex-objekt medomkompilera()fungera. (Kom ihåg att använda en råsträng.) Skicka in strängen du vill söka i Regex-objektets search()-metod. Detta returnerar ett Match-objekt. Anrop Match-objektets group()-metod för att returnera en sträng av den faktiska matchade texten.
Python3
# Python program to illustrate> # Matching regex objects> import> re> > # regex object> phoneNumRegex>=> re.>compile>(r>'ddd-ddd-dddd'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(>'Phone number found: '> +> mo.group())> |
>
>
Produktion:
Phone number found: 415-555-4242>
Parenteser för gruppering och fånga med Regex
Ett av sätten att matcha mönster med Regex är att använda parenteser runt mönstren. Låt oss se några olika exempel för en bättre förståelse.
Matchande objekt
Säg att du vill skilja riktnumret från resten av telefonnumret. Om du lägger till parenteser skapas grupper i regexet: (ddd)-(ddd-dddd). Sedan kan du använda metoden group() matchobjekt för att ta tag i den matchande texten från bara en grupp.
Python3
import> re> phoneNumRegex>=> re.>compile>(r>'(ddd)-(ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(mo.group(>1>))> areaCode, number>=> mo.groups()> print>(>'area code:'>, areaCode)> print>(>'number:'>, number)> |
>
>
Produktion:
415 area code: 415 number: 555-4242>
Hämta alla grupper på en gång
Om du vill hämta alla grupper på en gång, använd metoden groups(), - notera pluralformen för namnet.
Python3
import> re> phoneNumRegex>=> re.>compile>(r>'(ddd)-(ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(mo.groups())> |
>
java samling
>
Produktion:
('415', '555-4242')> Matcha en parentes
Parentes har en speciell betydelse i reguljära uttryck, men vad gör du om du behöver matcha en parentes i din text. Till exempel kanske de telefonnummer du försöker matcha har riktnumret satt inom parentes. I det här fallet måste du undkomma ( och ) tecknen med ett omvänt snedstreck. Skriv in följande i det interaktiva skalet:
Python3
import> re> phoneNumRegex>=> re.>compile>(r>'((ddd)) (ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My phone number is (415) 555-4242.'>)> print>(mo.group(>1>))> |
>
>
Produktion:
(415)>
( och ) escape-tecknen i den råa strängen som skickas till re.compile() kommer att matcha faktiska parenteser.
Reguljära uttryck: gruppering och rörkaraktären
De | karaktär kallas en pipe. Vi kan använda det var som helst vi vill matcha ett av många uttryck.
Exempel: Det reguljära uttrycket r'Batman|Tina Fey' matchar antingen 'Batman' eller 'Tina Fey'. När både Batman och Tina Fey förekommer i den sökta strängen, kommer den första förekomsten av matchande text att returneras som Match-objektet.
Python3
# Python program to illustrate> # Matching regex objects> # with multiple Groups with the Pipe> import> re> heroRegex>=> re.>compile> (r>'Batman|Tina Fey'>)> mo1>=> heroRegex.search(>'Batman and Tina Fey.'>)> print>(mo1.group())> |
>
>
Produktion:
'Batman'>
Förstå lockiga hängslen i Regex
Om vi har en grupp som vi vill upprepa ett visst antal gånger, följ gruppen i regexet med en siffra inom parentes.
Till exempel kommer regexet (Ha){3} att matcha strängen 'HaHaHa', men det kommer inte att matcha 'HaHa', eftersom den senare bara har två upprepningar av (Ha)-gruppen. Istället för bara en siffra kan du ange ett intervall mellan parenteserna. Regexet (Ha){3, 5} matchar 'HaHaHa', 'HaHaHaHa' och 'HaHaHaHaHa'. Du kan också utelämna den första eller andra siffran inom de krulliga parenteserna för att lämna minimum eller maximum obegränsat. (Ha){3, } kommer att matcha tre eller fler instanser av (Ha)-gruppen, medan (Ha){, 5} kommer att matcha noll till fem instanser. Lockiga parenteser kan hjälpa till att göra dina reguljära uttryck kortare.
Exempel 1: I det här exemplet kommer vi att använda krusiga parenteser för att specificera förekomsten av mönstret som vi letar efter.
Python3
# Python program to illustrate> # Matching Specific Repetitions> # with Curly Brackets> import> re> haRegex>=> re.>compile>(r>'(Ha){3}'>)> mo1>=> haRegex.search(>'HaHaHa'>)> print>(mo1.group())> |
>
>
Produktion:
t flip flop
HaHaHa>
Exempel 2: I det här exemplet kommer vi att definiera förekomsten av mönstret med hjälp av parenteser och sedan söka efter om ett specifikt mönster finns i det eller inte.
Python3
# Python program to illustrate> # Matching Specific Repetitions> # with Curly Brackets> import> re> haRegex>=> re.>compile>(r>'(Ha){3}'>)> mo2>=> haRegex.search(>'Ha'>)>=>=> None> print>(mo2)> |
>
>
Produktion:
True>
Valfri operatör eller frågetecken (?) i reguljärt uttryck
Ibland finns det ett mönster som du bara vill matcha. Det vill säga det regex bör hitta en match oavsett om den biten av text finns där eller inte. De ? tecken flaggar gruppen som föregår den som en valfri del av mönstret.
Exempel 1: Här kommer vi att söka efter ett mönster med ett mönster 'Batman' eller 'Batwoman'. De (var)? del av det reguljära uttrycket betyder att mönstret wo är en valfri grupp. Det regex kommer att matcha text som har noll instanser eller en instans av wo i sig. Det är därför det regex matchar både 'Batwoman' och 'Batman'. Du kan tänka på ? som att säga, grupper Matcha noll eller en av gruppen som föregår detta frågetecken.
Om du behöver matcha ett verkligt frågetecken, undvik det med ?.
Python3
# Python program to illustrate> # optional matching> # with question mark(?)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)?man'>)> mo1>=> batRegex.search(>'The Adventures of Batman'>)> mo2>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo1.group())> print>(mo2.group())> |
>
>
Produktion:
Batman Batwoman>
Noll eller fler mönster som matchar stjärnan
* (kallad stjärna eller asterisk) betyder matcha noll eller mer — gruppen som föregår stjärnan kan förekomma hur många gånger som helst i texten. Det kan vara helt frånvarande eller upprepas om och om igen. Om du behöver matcha ett verkligt stjärntecken, prefix stjärnan i det reguljära uttrycket med ett omvänt snedstreck, *.
Exempel 1: I det här exemplet kommer vi att matcha noll förekomster av ett mönster i strängen. (wo)*-delen av regexet matchar noll instanser av wo i strängen.
Python3
# Python program to illustrate> # matching a regular expression> # with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo1>=> batRegex.search(>'The Adventures of Batman'>)> print>(mo1.group())> |
>
>
Produktion:
Batman>
Exempel 2: I det här exemplet kommer vi att matcha minst en förekomst av ett mönster i strängen.
Pytonorm
tar bort från arraylist
#python program to illustrate> #matching a regular expression> #with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo2>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo2.group())> |
>
>
Produktion:
Batwoman>
Exempel 3: I det här exemplet kommer vi att matcha mer än en förekomst av ett mönster i strängen.
Pytonorm
# Python program to illustrate> # matching a regular expression> # with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo3>=> batRegex.search(>'The Adventures of Batwowowowoman'>)> print>(mo3.group())> |
>
>
Produktion:
Batwowowowoman>
Ett eller flera mönster som matchar med Plus
Medan * betyder matcha noll eller mer , betyder + (eller plus). matcha en eller flera. Till skillnad från stjärnan, som inte kräver att dess grupp visas i den matchade strängen, måste gruppen som föregår ett plus visas minst en gång. Det är inte valfritt. Om du behöver matcha ett faktiskt plustecken, prefix plustecknet med ett snedstreck för att undvika det: +.
Exempel 1: I det här exemplet kommer vi att matcha minst en förekomst av ett mönster i strängen.
Python3
# Python program to illustrate> # matching a regular expression> # with plus(+)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)+man'>)> mo1>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo1.group())> |
>
>
Produktion:
Batwoman>
Exempel 2: I det här exemplet kommer regexet Bat(wo)+man inte att matcha strängen 'The Adventures of Batman' eftersom minst en wo krävs av plustecknet.
förskjuten höjd
Pytonorm
# Python program to illustrate> # matching a regular expression> # with plus(+)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)+man'>)> mo3>=> batRegex.search(>'The Adventures of Batman'>)>=>=> None> print>(mo3)> |
>
>
Produktion:
True>
Relaterad artikel – Regex Cheetsheet