Piemēram, rakstot URL apstrādātājus (un Dievs jums palīdzēs, ja jūs to rakstāt no nulles), jūs bieži vēlaties parādīt to pašu rezultātu neatkarīgi no tā, vai URL ir pēdējais '/'. E.g https: // piemērs.com / user / settings / un https: // piemērs.com / user / settings abiem jānorāda uz vienu un to pašu lapu, neskatoties uz “/”.
Tomēr jūs nevarat ignorēt visas slīpsvītras uz priekšu, piemēram:
- Slīpsvītrs starp “lietotājs” un “iestatījumi”, e, “lietotājs / iestatījumi”.
- Jums būs jāņem vērā arī “//” sava FQDN sākumā, kam seko “https”.
Tātad, jūs izdomājat tādu likumu kā: “Ignorējiet tikai priekšējās slīpsvītras, kam seko tukša vieta.”Un, ja vēlaties, varat šo kodu iekodēt ar virkni if-else paziņojumu. Bet tas diezgan ātri kļūs apgrūtinošs. Varat uzrakstīt funkciju sakot cleanUrl (), kas to var iekapsulēt jums. Bet Visums drīz sāks jums mest vairāk līkumu. Drīz jūs atradīsit rakstīšanas funkcijas cleanHeaders (), processLog () utt. Vai arī jūs varat izmantot regulāru izteiksmi ikreiz, kad ir nepieciešama jebkāda veida modeļu saskaņošana.
Standarta IO un faili
Pirms iedziļināmies regulāro izteiksmju detaļās, ir vērts pieminēt modeli, kas vairumam sistēmu ir teksta straumēm. Šeit ir īss (nepilnīgs) tā kopsavilkums:
- Teksts tiek apstrādāts kā (viena) rakstzīmju plūsma.
- Šī straume var rasties no faila ar Unicode vai ASCII tekstu vai no standarta ievades (tastatūras) vai no attālā tīkla savienojuma. Pēc apstrādes, teiksim ar regex skriptu, izeja vai nu nonāk faila vai tīkla straumē, vai standarta izvadē (piemēram,.g, konsole)
- Straume sastāv no vienas vai vairākām līnijām. Katrā rindā ir nulle vai vairāk rakstzīmju, kam seko jauna rinda.
Vienkāršības labad es vēlos, lai jūs attēlotu, ka fails sastāv no līnijām, kas beidzas ar jaunas līnijas rakstzīmi. Mēs sadalām šo failu atsevišķās rindās (vai virknēs), katra beidzas ar jaunu līniju vai parastu rakstzīmi (pēdējai rindai).
Regexs un virkne
Regex izteiksmei nav īpaši sakara ar failiem. Iedomājieties to kā melnu lodziņu, kas var ievadīt jebkuru patvaļīgu jebkura (ierobežota) garuma virkni, un, sasniedzot šīs virknes beigas, tā var:
- Pieņemiet virkni. Citiem vārdiem sakot, virkne sērkociņi regulārā izteiksme (regex).
- Noraidiet virkni, t.e, virkne nav spēles regulārā izteiksme (regex).
Neskatoties uz tā melnās kastes raksturu, es šim machinatoram pievienošu vēl dažus ierobežojumus. Regulārais izteiciens nolasa virkni secīgi, no kreisās uz labo, un tajā vienlaikus tiek lasīts tikai viens raksturs. Tātad virkne “LinuxHint” lasīt šādi:
'L "i" n "u" x "H" i "n" t' [no kreisās uz labo]
Sāksim vienkārši
Vienkāršākais regex veids ir virknes “C” meklēšana un atbilstība. Regulārā izteiksme ir tikai “C”. Diezgan triviāls. Veidam, kā to izdarīt Python, vispirms būs jāimportē re modulis regulārajām izteiksmēm.
>>> importēt atkārtotiPēc tam mēs izmantojam funkciju re.Meklēt(raksts, aukla) kur modeli ir mūsu regulārā izteiksme un virkne ievades virknē, kurā mēs meklējam modeli.
>>> atkārtoti.meklēšana ('C', 'Šajā teikumā ir apzināts C')Funkcija uzņem zīmējumu "C", meklē to ievades virknē un izdrukā vietu (laidums) kur atrodams minētais paraugs. Šī virknes daļa, šī apakšvirkne atbilst mūsu regulārajai izteiksmei. Ja nebūtu šādas atrastas atbilstības, iznākums būtu a Nav objekts.
Līdzīgi jūs varat meklēt modeli “regulārā izteiksme” šādi:
>>> atkārtoti.meklēšana (“regulārā izteiksme”, “Mēs varam izmantot regulāras izteiksmes, lai meklētu modeļus.”)re.meklēt (), atkārtoti.spēles () un atkārtoti.fullmatch ()
Trīs noderīgas moduļa funkcijas ietver:
1. re.Meklēt(raksts, aukla)
Tas atgriež apakšvirkni, kas atbilst modelim, kā mēs redzējām iepriekš. Ja atbilstība netiek atrasta Nav tiek atgriezta. Ja dotajam paraugam atbilst vairākas apakšstruktūras, tiek ziņots tikai par pirmo sastopamību.
2. re.spēles (raksts, aukla)
Šī funkcija mēģina saskaņot piegādāto modeli no virknes sākuma. Ja tas kaut kur pusceļā saskaras ar pārtraukumu, tas atgriežas Nav.
Piemēram,
>>> atkārtoti.mačs ("Joh", "John Doe")Kur kā virkne “Mans vārds ir Džons Doe” nav sakritība, un līdz ar to Nav tiek atgriezta.
>>> druka (atkārtoti.spēles (“Joh”, “Mani sauc Džons Doe”))Nav
3. re.fullmatch (raksts, aukla)
Tas ir stingrāks nekā abi iepriekš minētie, un mēģina atrast precīzu modeļa atbilstību virknē, pretējā gadījumā noklusējums ir Nav.
>>> druka (atkārtoti.fullmatch ("Joh", "Joh"))# Viss pārējais nebūs spēle
Es izmantošu tikai re.Meklēt() funkcija šajā rakstā. Ikreiz, kad es saku, ka regex pieņem šo virkni, tas nozīmē, ka athe re.Meklēt() funkcija ir atradusi atbilstošu apakšvirkni ievades virknē un atdevusi to, nevis Navobjekts.
Īpašās rakstzīmes
Regulāri izteicieni, piemēram, “Jānis” un “C”, nav daudz lietojami. Mums ir nepieciešamas īpašas rakstzīmes, kuras regulāru izteicienu kontekstā nozīmē konkrētas rakstzīmes. Šeit ir daži piemēri:
-
- ^ - Tas sakrīt ar virknes sākumu. Piemēram, '^ C' sakritīs ar visām virknēm, kas sākas ar burtu C.
- $ - tas atbilst rindas beigām.
- . - Punkts norāda vienu vai vairākas rakstzīmes, izņemot jauno līniju.
- * - tas ir līdz nullei vai vairāk raksturs tam, kas bija pirms tā. Tātad b * atbilst 0 vai vairākiem b gadījumiem. ab * atbilst tikai a, ab un a
- + - Tas attiecas uz vienu vai vairākiem raksturiem, kas bija pirms tā. Tātad b + atbilst 1 vai vairākiem b gadījumiem. ab * atbilst tikai a, ab un a
- \ - atpakaļgaitas slīpsvītru regexes izmanto kā aizbēgšanas secību. Tāpēc jūs vēlaties regulāru izteiksmi, lai meklētu dolāra simbola '$' burtisko klātbūtni rindas beigās. Jūs varat rakstīt \ $ parastajā izteiksmē.
- Cirtainās lencītes var izmantot, lai norādītu atkārtojumu skaitu, kuru vēlaties redzēt. Piemēram, modelis, piemēram, ab 10, apzīmē virkni a, kurai seko 10 b, atbilst šim modelim. Varat norādīt arī skaitļu diapazonu, piemēram, b 4,6 sakrīt ar virknēm, kurās b atkārtojas 4 līdz 6 reizes pēc kārtas. 4 vai vairāk atkārtojumu modelim būtu nepieciešams tikai pēdējais komats, piemēram, b 4,
- Kvadrātiekavas un rakstzīmju diapazons. RE, piemēram, [0-9], var darboties kā vietturis jebkuram ciparam no 0 līdz 9. Līdzīgi jums var būt cipari no viena līdz pieciem [1–5] vai, lai tie atbilstu jebkuram lielo burtu lietojumam [A – Z] vai jebkuram alfabēta burtam neatkarīgi no tā, vai tas ir lielais vai mazais burts [A – z].
Piemēram, jebkura virkne, kas sastāv no tieši desmit cipariem, atbilst regulārajai izteiksmei [0-9] 10, kas ir ļoti noderīgi, ja meklējat tālruņu numurus dotajā virknē. - Varat izveidot OR līdzīgu priekšrakstu, izmantojot | raksturs, kurā regulāru izteiksmi veido divi vai vairāki regulāri izteicieni, piemēram, A un B. Regex izteiksme A | B ir atbilstība, ja ievades virkne ir vai nu atbilstība regulārajai izteiksmei A, vai B.
- Varat sagrupēt dažādus regulāros veidus. Piemēram, regex (A | B) C sakritīs ar AC un
Ir daudz vairāk, kas jāaptver, bet es ieteiktu mācīties, ejot, nevis pārslogot smadzenes ar daudziem neskaidriem simboliem un malām. Ja rodas šaubas, Python Docs ir lieliska palīdzība, un tagad jūs zināt pietiekami daudz, lai viegli sekotu dokumentiem.
Rokas par pieredzi un atsaucēm
Ja vēlaties redzēt sava regex vizuālu interpretāciju, varat apmeklēt Debuggex. Šī vietne reāllaikā ģenerē jūsu regex skatu un ļauj to pārbaudīt, izmantojot dažādas ievades virknes.
Lai uzzinātu vairāk par regulāro izteicienu teorētisko aspektu, ieteicams apskatīt Maikla Sipsera ievaddaļas “Skaitļošanas teorija” pirmās pāris nodaļas. Tās ir ļoti viegli sekot un parāda regulāro izteicienu kā pašas skaitļošanas pamatjēdziena nozīmi!