Galbūt žinote, kaip ieškoti teksto paspausdami ctrl-F ir įvesdami ieškomus žodžius. Reguliarūs posakiai žengia dar vieną žingsnį: jie leidžia nurodyti ieškomo teksto šabloną. Šiame straipsnyje pamatysime, kaip šablonų suderinimas Python veikia su Regex.
Regex Python
Įprastos išraiškos , taip pat vadinama reguliarioji išraiška , yra teksto modelio aprašymai. Jis gali aptikti teksto buvimą ar nebuvimą, suderindamas jį su konkrečiu šablonu, taip pat gali padalyti šabloną į vieną ar daugiau antrinių šablonų. Pavyzdžiui, a d reguliariajame reiškinyje reiškia skaitinį simbolį, ty bet kurį atskirą skaičių nuo 0 iki 9.
Patikrinkite telefono numerius naudodami „Regex“ programoje „Python“.
Šis regex naudojamas Python kad atitiktų trijų skaičių eilutę, brūkšnelį, dar tris skaičius, kitą brūkšnelį ir keturis skaičius.
Any other string would not match the pattern. ddd-ddd-dddd>
Įprastos išraiškos gali būti daug sudėtingesnės. Pvz., 3 pridėjimas garbanotuose skliaustuose ({3}) po šablono yra tarsi sakymas: suderinkite šį šabloną tris kartus. Taigi šiek tiek trumpesnė reguliarioji išraiška yra tokia:
įmesti į sql
d{3}-d{3}-d{4}> Jis atitinka teisingą telefono numerio formatą.
Šablonų suderinimas su reguliariosiomis išraiškomis
Regex objektas Paieška() Metodas ieško eilutėje, kuri yra perduodama, ar atitinka reguliariojo reiškinio atitiktį. Atitikties objektai turi group() metodą, kuris grąžins tikrąjį atitikusį tekstą iš ieškomos eilutės. Taip pat galite pamatytiRegex cheetsheetDaugiau informacijos.
Pavyzdys: Importuokite reguliariojo reiškinio modulį naudodami importavimo re. Sukurkite Regex objektą naudodamire.compile()funkcija. (Nepamirškite naudoti neapdorotos eilutės.) Perduokite eilutę, kurios norite ieškoti, į Regex objekto paieškos() metodą. Tai grąžina atitikimo objektą. Iškvieskite Match objekto group() metodą, kad grąžintumėte tikrojo atitikusio teksto eilutę.
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())> |
>
>
Išvestis:
Phone number found: 415-555-4242>
Grupavimo ir fiksavimo naudojant Regex skliausteliai
Vienas iš modelių derinimo su Regex būdų yra naudoti skliaustus aplink raštus. Pažvelkime į kelis skirtingus pavyzdžius, kad geriau suprastume.
Sutampantys objektai
Tarkime, kad norite atskirti vietovės kodą nuo likusio telefono numerio. Pridėjus skliaustus, reguliariajame reiškinyje bus sukurtos grupės: (ddd)-(ddd-dddd). Tada galite naudoti group() atitikties objekto metodą, kad paimtumėte atitinkantį tekstą tik iš vienos grupės.
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)> |
>
>
Išvestis:
415 area code: 415 number: 555-4242>
Gaukite visas grupes vienu metu
Jei norite gauti visas grupes vienu metu, naudokite group(), metodą – atkreipkite dėmesį į pavadinimo daugiskaitos formą.
Python3
import> re> phoneNumRegex>=> re.>compile>(r>'(ddd)-(ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(mo.groups())> |
>
>
Išvestis:
('415', '555-4242')> Suderinkite skliaustą
Skliausteliuose įprastose išraiškose yra ypatinga reikšmė, bet ką daryti, jei tekste reikia suderinti skliaustą. Pavyzdžiui, gali būti, kad telefonų numerių, kuriuos bandote suderinti, vietovės kodas yra nustatytas skliausteliuose. Tokiu atveju reikia palikti ( ir ) simbolius pasviruoju brūkšniu. Į interaktyvų apvalkalą įveskite:
Python3
vykdyti scenarijaus apvalkalą
import> re> phoneNumRegex>=> re.>compile>(r>'((ddd)) (ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My phone number is (415) 555-4242.'>)> print>(mo.group(>1>))> |
>
>
Išvestis:
(415)>
( ir ) pabėgimo simboliai neapdorotoje eilutėje, perduodamoje į re.compile(), atitiks tikrus skliaustų simbolius.
Reguliarūs reiškiniai: grupavimas ir vamzdžio simbolis
The | personažas vadinamas vamzdžiu. Galime jį naudoti visur, kur norime atitikti vieną iš daugelio posakių.
Pavyzdys: Reguliarus posakis r'Batman|Tina Fey' atitiks arba 'Betmenas' arba 'Tina Fey'. Kai ieškomoje eilutėje yra ir Betmenas, ir Tina Fey, pirmasis atitikusio teksto atvejis bus grąžintas kaip atitikimo objektas.
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())> |
>
>
Išvestis:
'Batman'>
Garbanotų breketų supratimas naudojant Regex
Jei turime grupę, kurią norime pakartoti tam tikrą skaičių kartų, sekkite grupę reguliariajame reiškinyje su skaičiumi skliausteliuose.
Pavyzdžiui, reguliarioji išraiška (Ha){3} atitiks eilutę „HaHaHa“, bet neatitiks „HaHa“, nes pastaroji turi tik du (Ha) grupės pasikartojimus. Vietoj vieno skaičiaus galite nurodyti diapazoną tarp garbanotų skliaustų. Reguliarioji išraiška (Ha){3, 5} atitiks „HaHaHa“, „HaHaHaHa“ ir „HaHaHaHaHa“. Taip pat galite palikti pirmąjį arba antrąjį skaičių lenktuose skliaustuose, kad minimalus arba maksimalus skaičius nebūtų apribotas. (Ha){3, } atitiks tris ar daugiau (Ha) grupės atvejų, o (Ha){, 5} atitiks nuo nulio iki penkių atvejų. Garbanoti skliaustai gali padėti sutrumpinti reguliariąsias išraiškas.
1 pavyzdys: Šiame pavyzdyje mes naudosime lenktus skliaustus, kad nurodytume ieškomo modelio atsiradimą.
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())> |
>
>
Išvestis:
HaHaHa>
2 pavyzdys: Šiame pavyzdyje apibrėžsime šablono atsiradimą naudodami lenktus skliaustus ir ieškosime, ar jame yra konkretus raštas, ar ne.
Python3
if ir else in bash
# 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)> |
>
>
Išvestis:
True>
Pasirenkamas operatorius arba klaustukas (?) reguliariajame reiškinyje
Kartais yra modelis, kurį norite suderinti tik pasirinktinai. Tai reiškia, kad reguliarioji išraiška turėtų rasti atitiktį, nesvarbu, ar yra ta teksto dalis, ar ne. The ? simbolis pažymi grupę, kuri yra prieš jį kaip pasirenkamą modelio dalį.
1 pavyzdys: Čia ieškosime modelio su raštu „Betmenas“ arba „Batwoman“. The (kur)? reguliariosios išraiškos dalis reiškia, kad modelis wo yra neprivaloma grupė. Reguliarioji išraiška atitiks tekstą, kuriame yra nulis egzempliorių arba vienas wo egzempliorius. Štai kodėl reguliarioji išraiška atitinka ir „Batwoman“, ir „Batman“. Ar galite galvoti apie? kaip sakant, grupės Atitinka nulį arba vieną iš grupių, esančių prieš šį klaustuką.
Jei reikia atitikti tikrąjį klaustuko simbolį, išeikite jį naudodami ?.
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())> |
>
>
Išvestis:
Batman Batwoman>
Nulinis arba daugiau raštų suderinimas su žvaigžde
* (vadinamas žvaigždute arba žvaigždute) reiškia atitinka nulį ar daugiau — grupė, einanti prieš žvaigždę, tekste gali pasirodyti bet kokį skaičių kartų. Jo gali visiškai nebūti arba kartotis vėl ir vėl. Jei reikia atitikti tikrąjį žvaigždės simbolį, įprastoje reiškinyje prieš žvaigždutę įrašykite pasvirąjį brūkšnį *.
1 pavyzdys: Šiame pavyzdyje mes suderinsime nulinius šablono atvejus eilutėje. Reguliaraus reiškinio dalis (wo)* atitinka nulinius wo atvejus eilutėje.
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())> |
>
>
Išvestis:
Batman>
2 pavyzdys: Šiame pavyzdyje mes suderinsime bent vieną šablono atvejį eilutėje.
Python
#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())> |
>
js kelių eilučių eilutę
>
Išvestis:
Batwoman>
3 pavyzdys: Šiame pavyzdyje mes suderinsime daugiau nei vieną šablono atvejį eilutėje.
Python
# 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())> |
>
>
Išvestis:
Batwowowowoman>
Vienas ar daugiau raštų suderinimas su pliusu
Nors * reiškia atitinka nulį ar daugiau , + (arba pliusas) reiškia atitinka vieną ar daugiau. Skirtingai nuo žvaigždutės, kuri nereikalauja, kad jos grupė būtų rodoma suderintoje eilutėje, grupė prieš pliusą turi būti rodoma bent kartą. Tai neprivaloma. Jei reikia suderinti tikrąjį pliuso ženklą, prieš pliuso ženklą įtraukite pasvirąjį brūkšnį: +.
1 pavyzdys: Šiame pavyzdyje mes suderinsime bent vieną šablono atvejį eilutėje.
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())> |
>
>
Išvestis:
Batwoman>
2 pavyzdys: Šiame pavyzdyje reguliarioji formulė Bat(wo)+man neatitiks eilutės „Betmeno nuotykiai“, nes pliuso ženklas reikalauja bent vieno „wo“.
vidutinis vs vidurkis
Python
# 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)> |
>
>
Išvestis:
True>
Susijęs straipsnis – Regex Cheetsheet