Python

Regulārās izteiksmes, izmantojot Python 3

Regulārās izteiksmes, izmantojot Python 3
Regulārās izteiksmes bieži tiek uzskatītas par patiešām neskaidrām hieroglifu sērijām, kuras parasti kopē no interneta un ielīmē savā kodā. Pēc tam šī noslēpumainā burvestība parāda burvju iespējas atrast modeļus teksta virknēs, un, ja mēs to labi prasīsim, tas mums pat palīdzēs noteiktā raksta aizvietošanu virknē ar kaut ko jauku.

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:

  1. Slīpsvītrs starp “lietotājs” un “iestatījumi”, e, “lietotājs / iestatījumi”.
  2. 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:

  1. Teksts tiek apstrādāts kā (viena) rakstzīmju plūsma.
  2. Šī 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)
  3. 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:

  1. Pieņemiet virkni. Citiem vārdiem sakot, virkne sērkociņi regulārā izteiksme (regex).
  2. 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ārtoti

Pē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:

    1. ^ - Tas sakrīt ar virknes sākumu. Piemēram, '^ C' sakritīs ar visām virknēm, kas sākas ar burtu C.
    2. $ - tas atbilst rindas beigām.
    3. . - Punkts norāda vienu vai vairākas rakstzīmes, izņemot jauno līniju.
    4. * - 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
    5. + - 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
    6. \ - 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ē.
    7. 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,
    8. 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ē.
    9. 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.
    10. 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!

Komerciālo spēļu dzinēju atvērtā koda porti
Bezmaksas, atvērtā koda un starpplatformu spēļu dzinēju atpūtu var izmantot, lai spēlētu vecos, kā arī dažus no diezgan nesenajiem spēļu nosaukumiem. ...
Labākās komandrindas spēles Linux
Komandrinda nav tikai lielākais sabiedrotais, lietojot Linux, bet tā var būt arī izklaides avots, jo to var izmantot, lai spēlētu daudzas jautras spēl...
Labākās Linux spēļu gamepad kartēšanas lietotnes
Ja jums patīk spēlēt spēles Linux ar parastu tastatūru, nevis parasto tastatūru un peles ievades sistēmu, jums ir dažas noderīgas lietotnes. Daudzas d...