Skjöl fyrir Re-eininguna fyrir Python 3 í . Endur eining fyrir reglulegar tjáningar

Regluleg tjáning er mjög vinsæll hluti af nánast hvaða forritunarmáli sem er. Þeir hjálpa þér að fá fljótt aðgang að þeim upplýsingum sem þú þarft. Einkum eru þau notuð þegar nauðsynlegt er að vinna texta. Python kemur sjálfgefið með sérstakri einingu. re, sem sér um að vinna með reglubundnar tjáningar.

Í dag munum við tala í smáatriðum um hvað það er almennt, hvernig á að vinna með þá og hvernig einingin re mun hjálpa.

Regluleg orðasambönd: kynning

Hver er notkun reglulegra tjáninga? Næstum allt. Til dæmis þessar:

  1. Vefforrit sem krefjast löggildingar texta. Dæmigerð dæmi eru netpóstforrit.
  2. Öll önnur verkefni sem tengjast texta, gagnagrunnum og svo framvegis.

Áður en við byrjum að flokka setningafræðina ættum við að skilja nánar grundvallarreglurnar um starfsemi bókasafnsins re og almennt hvað er almennt gott við það. Við munum einnig gefa dæmi frá raunverulegri æfingu, þar sem við munum lýsa hvernig notkun þeirra er notuð. Þú getur búið til slíkt sniðmát sem hentar þér til að framkvæma margs konar aðgerðir með texta.

Hvað er sniðmát í Re bókasafninu?

Með því er hægt að leita að upplýsingum af ýmsum gerðum, fá upplýsingar sem samsvara þeim, til að gera aðrar aðgerðir aðlögunarhæfari. Og auðvitað að vinna úr þessum gögnum.

Taktu til dæmis eftirfarandi sniðmát: s+. Það þýðir hvaða bilstaf sem er. Ef þú bætir plúsmerki við það þýðir þetta að mynstrið inniheldur fleiri en eitt bil. Það getur jafnvel passað við flipastafi sem eru kallaðir með t+.

Áður en þú notar þau þarftu að flytja inn bókasafnið Re. Eftir það notum við sérstaka skipun til að setja saman sniðmátið. Þetta er gert í tveimur skrefum.

>>> innflutningur um

>>> regex = re.compile('s+')

Nánar tiltekið framkvæmir þessi kóði aðgerðina við að setja saman sniðmát sem hægt er að nota. til dæmis til að leita að bilum (eitt eða fleiri).

Að fá aðskildar upplýsingar frá mismunandi strengjum með því að nota reglulegar segðir

Segjum að við höfum breytu sem inniheldur eftirfarandi upplýsingar.

>>> texti = “””100 INF upplýsingafræði

213 MAT Stærðfræði  

156 ENG Enska»»»

Það inniheldur þrjú þjálfunarnámskeið. Hver þeirra samanstendur af þremur hlutum - númer, kóða og nafn. Við sjáum að bilið á milli þessara orða er mismunandi. Hvað á að gera til að skipta þessari línu í aðskildar tölur og orð? Það eru tvær aðferðir til að ná þessu markmiði:

  1. kalla á fall aftur.skipt.
  2. beita aðgerð hættu fyrir regex.

Hér er dæmi um notkun setningafræði hverrar aðferðar fyrir breytuna okkar.

>>> re.split('s+', texti)  

# eða

>>> regex.split(texti)

Úttak: ['100', 'INF', 'Tölvunarfræði', '213', 'MAT', 'Math', '156', 'ENG', 'English']

Almennt er hægt að nota báðar aðferðirnar. En það er í raun miklu auðveldara að nota reglulega tjáningu í stað þess að nota aðgerðina mörgum sinnum. aftur.skipt.

Að finna samsvörun með þremur aðgerðum

Segjum að við þurfum aðeins að draga tölur úr streng. Hvað þarf að gera fyrir þetta?

re.findall()

Hér er notkunartilvik fyrir aðgerðina finnaall(), sem, ásamt reglulegum segðum, gerir þér kleift að draga tilvik einni eða fleiri tölum úr textabreytu.

>>> prenta (texti)  

100 INF upplýsingafræði

213 MAT Stærðfræði  

156 ENG Enska

>>> regex_num = re.compile('d+')  

>>> regex_num.findall(texti)  

['100', '213', '156']

Ásamt d tákninu notuðum við sniðmát sem gefur til kynna nákvæmlega hvaða tölugildi sem er staðsett í breytu eða texta. Og þar sem við bættum einum + við þarna þýðir þetta að að minnsta kosti ein tala verður að vera til staðar. 

Þú getur líka notað * táknið til að tilgreina að tilvist tölustafs sé ekki nauðsynleg til að samsvörun finnist.

En í okkar tilviki, þar sem við notuðum +, þykktum við út með finnaall() 1 eða fleiri stafrænar merkingar á námskeiðum úr textanum. Þannig, í okkar tilviki, virka reglulegar tjáningar sem stillingar fyrir aðgerðina.

re.search() vs re.match()

Eins og þú getur giskað á af nafni aðgerðanna leitar sá fyrsti að samsvörun í textanum. Spurning: Hver er munurinn á milli finnaall? Aðalatriðið er að það skilar tilteknum hlut sem passar við mynstrið, en ekki alla röð fundinna niðurstaðna í formi lista, eins og fyrra fallið.

Aftur á móti gerir re.match aðgerðin það sama. Aðeins setningafræði er öðruvísi. Sniðmátið verður að setja í byrjun. 

Tökum dæmi sem sýnir þetta.

>>> # búðu til breytu með texta

>>> text2 = «»»INF upplýsingafræði

213 MAT stærðfræði 156″»»  

>>> # settu saman regex og leitaðu að mynstrum

>>> regex_num = re.compile('d+')  

>>> s = regex_num.search(text2)  

>>> print('First index: ', s.start())  

>>> print('Last index: ', s.end())  

>>> print(text2[s.start():s.end()]) 

Fyrsta vísitala: 17 

Síðasta vísitala: 20

213

Ef þú vilt fá svipaða niðurstöðu á annan hátt geturðu notað aðgerðina hópur().

Að skipta út hluta af texta fyrir Re bókasafn

Notaðu aðgerðina til að skipta út texta re.sub(). Segjum sem svo að listinn okkar yfir námskeiðin hafi breyst aðeins. Við sjáum að eftir hvert stafrænt gildi höfum við flipa. Verkefni okkar er að sameina alla þessa röð í eina línu. Til að gera þetta þurfum við að skipta út tjáningunni s+ að fara framhjá 

Upprunalega textinn var:

# búðu til breytu með texta

>>> texti = “””100 INF t Upplýsingafræði

213 MAT t Stærðfræði  

156 ENG t enska»»»  

>>> prenta (texti)  

100 UPPLÝSINGAR Tölvunarfræði

213 MAT Stærðfræði  

156 ENG Enska

Til að framkvæma æskilega aðgerð notuðum við eftirfarandi kóðalínur.

# skiptu út einu eða fleiri bilum fyrir 1

>>> regex = re.compile('s+')  

>>> print(regex.sub(' ', texti))  

Þar af leiðandi höfum við eina línu. 

101 COM Tölvur 205 MAT Stærðfræði 189 ENG Enska

Íhugaðu nú annað vandamál. Við stöndum ekki frammi fyrir því verkefni að setja rými. Það er miklu mikilvægara fyrir okkur að öll námskeiðsnöfn byrji á nýrri línu. Til að gera þetta er önnur tjáning notuð sem bætir nýrri línu við undantekninguna. Hvers konar tjáning er þetta?

Bókasafn Re styður eiginleika eins og neikvæða samsvörun. Það er frábrugðið beinu að því leyti að það inniheldur upphrópunarmerki á undan skástrikinu. Það er, ef við þurfum að sleppa nýlínustafnum, þá þurfum við að skrifa !n í stað n.

Við fáum eftirfarandi kóða.

# fjarlægðu öll bil nema nýlínu  

>>> regex = re.compile('((?!n)s+)')  

>>> print(regex.sub(' ', texti))  

100 INF upplýsingafræði

213 MAT Stærðfræði  

156 ENG Enska

Hvað eru reglulegar tjáningarhópar?

Með hjálp hópa af reglulegum tjáningum getum við fengið viðkomandi hluti í formi aðskildra þátta, en ekki í einni línu. 

Segjum sem svo að við þurfum að fá námskeiðsnúmer, kóða og nafn ekki í einni línu, heldur sem aðskilda þætti. Til að klára verkefnið þarftu að skrifa gríðarlegan fjölda af óþarfa línum af kóða. 

Reyndar er hægt að einfalda verkefnið til muna. Þú getur sett saman sniðmátið fyrir allar færslur og bara tilgreint gögnin sem þú þarft til að fá úr sviga.

Það verður mjög lítið af línum. 

# búðu til hópa af námskeiðstextasniðmátum og dragðu þau út

>>> course_pattern = '([0-9]+)s*([A-ZY]{3})s*([a-zA-ZoY]{4,})'  

>>> re.findall(námskeiðsmynstur, texti)  

[('100', 'INF', 'Tölvunarfræði'), ('213', 'MAT', 'Math'), ('156', 'ENG', 'English')]

Hugmyndin um „gráðuga“ samsvörun

Venjulega eru regluleg tjáning forrituð til að draga út hámarksmagn samsvarandi gagna. Og jafnvel þótt þú þurfir miklu minna.

Við skulum skoða sýnishorn af HTML kóða þar sem við þurfum að fá merkið.

>>> text = "Dæmi um gráðuga samsvörun reglulega"  

>>> re.findall('', texti)  

['Dæmi um gráðuga samsvörun reglulega']

Í stað þess að draga aðeins út eitt merki fékk Python allan strenginn. Þess vegna er það kallað gráðugur.

Og hvað á að gera til að fá aðeins merkið? Í þessu tilfelli þarftu að nota lata samsvörun. Til að tilgreina slíka tjáningu er spurningarmerki bætt við endann á mynstrinu.

Þú færð eftirfarandi kóða og úttak túlksins.

>>> re.findall('', texti)  

[", "]

Ef það er nauðsynlegt til að fá aðeins fyrsta tilvikið, þá er aðferðin notuð leita ().

re.search('', text).group()  

"

Þá finnst aðeins upphafsmerkið.

Vinsæl tjáningarsniðmát

Hér er tafla sem inniheldur algengustu reglubundnar tjáningarmynstur.

Skjöl fyrir Re-eininguna fyrir Python 3 í . Endur eining fyrir reglulegar tjáningar

Niðurstaða

Við höfum aðeins skoðað grunnaðferðirnar til að vinna með reglubundnar segðir. Í öllum tilvikum hefur þú séð hversu mikilvæg þau eru. Og hér skiptir engu máli hvort nauðsynlegt er að flokka allan textann eða einstök brot hans, hvort það er nauðsynlegt að greina færslu á samfélagsneti eða safna gögnum til að vinna úr þeim síðar. Regluleg tjáning er áreiðanlegur hjálparhella í þessu máli.

Þeir leyfa þér að framkvæma verkefni eins og:

  1. Tilgreina snið gagna, svo sem netfang eða símanúmer.
  2. Að fá streng og skipta honum í nokkra smærri strengi.
  3. Framkvæma ýmsar aðgerðir með texta, svo sem að leita, draga út nauðsynlegar upplýsingar eða skipta út hluta af stöfunum.

Regluleg tjáning gerir þér einnig kleift að framkvæma óléttar aðgerðir. Við fyrstu sýn er ekki auðvelt að ná tökum á þessum vísindum. En í reynd er allt staðlað, svo það er nóg að reikna það út einu sinni, eftir það er hægt að nota þetta tól ekki aðeins í Python, heldur einnig í hvaða öðru forritunarmáli sem er. Jafnvel Excel notar reglulegar tjáningar til að gera sjálfvirkan gagnavinnslu. Svo það er synd að nota ekki þetta tól.

Skildu eftir skilaboð