Dokumentatioun fir de Re Modul fir Python 3 an. Re Modul fir regelméisseg Ausdréck

Regelméisseg Ausdréck sinn e ganz populäre Bestanddeel vu bal all Programméierungssprooch. Si hëllefen Iech séier op d'Informatioun ze kommen déi Dir braucht. Besonnesch gi se benotzt wann et néideg ass Text ze veraarbecht. Python kënnt mat engem spezielle Modul par défaut. re, déi verantwortlech ass fir mat regulären Ausdréck ze schaffen.

Haut wäerte mir am Detail schwätzen iwwer wat et am Allgemengen ass, wéi mat hinnen ze schaffen a wéi de Modul re wäert hëllefen.

Regelméisseg Ausdréck: eng Aféierung

Wat sinn d'Benotzunge vu reguläre Ausdréck? Bal all. Zum Beispill, dës:

  1. Webapplikatiounen déi Textvalidatioun erfuerderen. En typescht Beispill ass Online Mail Clienten.
  2. All aner Projeten am Zesummenhang mat Texter, Datenbanken a sou weider.

Ier mir ufänken d'Syntax ze analyséieren, sollte mir d'Basisprinzipien vum Fonctionnement vun der Bibliothéik méi detailléiert verstoen re an allgemeng, wat ass allgemeng gutt doriwwer. Mir ginn och Beispiller aus der realer Praxis, wou mir de Mechanismus vun hirer Benotzung beschreiwen. Dir kënnt esou eng Schabloun erstellen, passend fir Iech eng grouss Varietéit vun Operatiounen mat Text auszeféieren.

Wat ass eng Schabloun an der Re-Bibliothéik?

Mat et kënnt Dir no Informatioun vu verschiddenen Typen sichen, Informatioune kréien, déi hinnen entspriechend sinn, fir aner Funktiounen méi adaptiv ze maachen. An, natierlech, dës Donnéeën ze veraarbecht.

Huelt zum Beispill déi folgend Schabloun: s+. Et heescht all Raum Charakter. Wann Dir e Plus Zeechen derbäi addt, heescht dat datt d'Muster méi wéi ee Raum enthält. Et kann och Tab Zeeche Match datt mat genannt ginn t+.

Ier Dir se benotzt, musst Dir d'Bibliothéik importéieren Re. Duerno benotze mir e spezielle Kommando fir d'Schabloun ze kompiléieren. Dëst gëtt an zwee Schrëtt gemaach.

>>> importéieren re

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

Speziell mécht dëse Code d'Operatioun fir eng Schabloun ze kompiléieren déi benotzt ka ginn. zum Beispill, fir Plazen ze sichen (eng oder méi).

Getrennt Informatioun vu verschiddene Saiten mat reguläre Ausdréck ze kréien

Ugeholl datt mir eng Variabel hunn déi folgend Informatioun enthält.

>>> text = """100 INF Informatik

213 MAT Mathematik  

156 ENG English»»»

Et enthält dräi Trainingscoursen. Jiddereng vun hinnen besteet aus dräi Deeler - Zuel, Code an Numm. Mir gesinn datt den Intervall tëscht dëse Wierder anescht ass. Wat maache fir dës Linn an getrennten Zuelen a Wierder opzedeelen? Et ginn zwou Methoden fir dëst Zil z'erreechen:

  1. ruffen eng Funktioun re.split.
  2. Funktioun applizéieren SPLIT fir regex.

Hei ass e Beispill fir d'Syntax vun jiddereng vun de Methoden fir eis Variabel ze benotzen.

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

# oder

>>> regex.split(text)

Ausgang: ['100', 'INF', 'Computer Science', '213', 'MAT', 'Math', '156', 'ENG', 'Englesch']

Allgemeng kënne béid Methode benotzt ginn. Awer et ass tatsächlech vill méi einfach e reguläre Ausdrock ze benotzen anstatt d'Funktioun e puer Mol ze benotzen. re.split.

Fannen Mätscher mat dräi Funktiounen

Loosst eis soen, mir mussen nëmmen Zuelen aus enger String extrahéieren. Wat muss dofir gemaach ginn?

re.findall()

Hei ass e Benotzungsfall fir d'Funktioun findall(), déi, zesumme mat reegelméissegen Ausdréck, erlaabt Iech Optriede vun enger oder méi Zuelen aus enger Textvariabel ze extrahieren.

>>> Drécken (Text)  

100 INF Informatik

213 MAT Mathematik  

156 ENG Eng

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

>>> regex_num.findall(text)  

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

Zesumme mam d Symbol hu mir eng Schabloun benotzt, déi absolut all numeresche Wäert an enger Variabel oder Text bezeechent. A well mer do een + dobäi gesat hunn, heescht dat, datt op d'mannst eng Zuel muss dobäi sinn. 

Dir kënnt och d'Zeechen * benotzen fir ze spezifizéieren datt d'Präsenz vun enger Ziffer net erfuerderlech ass fir e Match ze fannen.

Awer an eisem Fall, well mir + benotzt hunn, hu mir extrahéiert mat findall() 1 oder méi digital Bezeechnungen vun Coursen aus dem Text. Also, an eisem Fall, reegelméisseg Ausdréck handelen als Astellunge fir d'Funktioun.

re.search() vs re.match()

Wéi Dir kënnt aus dem Numm vun de Funktiounen roden, déi éischt Sich no engem Match am Text. Fro: Wat ass den Ënnerscheed tëscht fannen? De Punkt ass datt et e spezifeschen Objet zréckkënnt deen dem Muster entsprécht, an net déi ganz Sequenz vu fonnte Resultater a Form vun enger Lëscht, wéi déi viregt Funktioun.

Am Tour, der re.match Funktioun déi selwecht. Nëmmen d'Syntax ass anescht. D'Schabloun muss am Ufank gesat ginn. 

Loosst eis e Beispill huelen dat dat weist.

>>> # eng Variabel mat Text erstellen

>>> text2 = «»»INF Informatik

213 MAT Mathematics 156"»»  

>>> # regex kompiléieren a kuckt no Musteren

>>> 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()]) 

Éischt Index: 17 

Leschten Index: 20

213

Wann Dir en ähnlecht Resultat op eng aner Manéier wëllt kréien, kënnt Dir d'Funktioun benotzen group().

Ersetzen Deel vum Text mat Re Bibliothéik

Fir Text ze ersetzen, benotzt d'Funktioun re.sub(). Ugeholl eis Lëscht vu Coursen huet e bësse geännert. Mir gesinn datt no all digitale Wäert mir eng Tab hunn. Eis Aufgab ass all dës Sequenz an eng Zeil ze kombinéieren. Fir dëst ze maachen, musse mir den Ausdrock s+ ersetzen bestoen 

Den Originaltext war:

# erstellt eng Variabel mat Text

>>> text = “””100 INF t Informatik

213 MAT t Math  

156 ENG t English»»»  

>>> Drécken (Text)  

100 INFO Informatik

213 MAT Mathematik  

156 ENG Lëtzebuergesch

Fir déi gewënscht Operatioun auszeféieren, hu mir déi folgend Zeilen vum Code benotzt.

# ersetzen een oder méi Plazen mat 1

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

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

Als Resultat hu mir eng Linn. 

101 COM Computeren 205 MAT Mathematik 189 ENG Englesch

Betruecht elo en anere Problem. Mir sinn net mat der Aufgab konfrontéiert Plazen ze setzen. Et ass vill méi wichteg fir eis, datt all Course Nimm op enger neier Linn ufänken. Fir dëst ze maachen, gëtt en aneren Ausdrock benotzt, deen eng Neilinn un d'Ausnam bäidréit. Wéi eng Ausdrock ass dëst?

Bibliothéik Re ënnerstëtzt eng Feature wéi negativ Matching. Et ënnerscheet sech vun der direkter an datt et en Ausrufezeeche virun der Schnëtt enthält. Dat heescht, wa mer den Zeilenzeechen iwwersprange mussen, da musse mer !n amplaz n schreiwen.

Mir kréien de folgende Code.

# ewechzehuelen all Plazen ausser newline  

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

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

100 INF Informatik

213 MAT Mathematik  

156 ENG Eng

Wat sinn reegelméissegen Ausdrock Gruppen?

Mat der Hëllef vu Gruppe vu reguläre Ausdrock kënne mir déi gewënschte Objeten a Form vun getrennten Elementer kréien, an net an enger Linn. 

Ugeholl mir mussen d'Coursnummer, Code an Numm net an enger Zeil kréien, awer als separat Elementer. Fir d'Aufgab fäerdeg ze maachen, musst Dir eng riesech Unzuel vun onnéidege Codelinnen schreiwen. 

Tatsächlech kann d'Aufgab immens vereinfacht ginn. Dir kënnt d'Schabloun fir all Entréen kompiléieren a just d'Donnéeë spezifizéieren déi Dir braucht fir aus de Klammeren ze kréien.

Et gëtt eng ganz kleng Zuel vu Linnen. 

# erstellt Gruppen natierlech Text Templates an extrahéiert se

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

>>> re.findall(course_pattern, text)  

[('100', 'INF', 'Computer Science'), ('213', 'MAT', 'Math'), ('156', 'ENG', 'English')]

D'Konzept vun "giereg" passende

Normalerweis gi reegelméisseg Ausdréck programméiert fir de maximalen Betrag u passenden Donnéeën ze extrahieren. An och wann Dir vill manner braucht.

Loosst eis e Beispill HTML Code kucken wou mir den Tag musse kréien.

>>> text = "Beispill vu giereg Regular Expression Matching"  

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

['Beispill vu giereg Regular Expression Matching']

Amplaz just een Tag ze extrahieren, krut Python de ganze String. Dofir gëtt et giereg genannt.

A wat maache fir nëmmen den Tag ze kréien? An dësem Fall musst Dir faul Matcher benotzen. Fir esou en Ausdrock ze spezifizéieren, gëtt e Fragezeechen um Enn vum Muster bäigefüügt.

Dir kritt de folgende Code an d'Output vum Dolmetscher.

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

[", "]

Wann et erfuerderlech ass nëmmen déi éischt begéint Optriede ze kréien, da gëtt d'Method benotzt sichen ().

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

"

Da gëtt nëmmen den Ouverturestag fonnt.

Populär Ausdrock Schablounen

Hei ass en Dësch mat de meescht benotzte reguläre Ausdrockmuster.

Dokumentatioun fir de Re Modul fir Python 3 an. Re Modul fir regelméisseg Ausdréck

Konklusioun

Mir hunn nëmmen déi elementarst Methoden ugesinn fir mat reguläre Ausdréck ze schaffen. Dir hutt op alle Fall gesinn wéi wichteg se sinn. An hei mécht et keen Ënnerscheed ob et néideg ass de ganzen Text oder seng eenzel Fragmenter ze analyséieren, ob et néideg ass e Post op engem sozialen Netzwierk ze analyséieren oder Daten ze sammelen fir se spéider ze veraarbecht. Regelméisseg Ausdréck sinn en zouverléissege Helfer an dëser Matière.

Si erlaben Iech Aufgaben auszeféieren wéi:

  1. Spezifizéieren de Format vun den Donnéeën, wéi eng E-Mailadress oder Telefonsnummer.
  2. Kréien e String an opzedeelen et an e puer méi kleng Saiten.
  3. Maacht verschidde Operatiounen mat Text, wéi zum Beispill Sichen, Extrait vun der néideger Informatioun oder Ersatz vun engem Deel vun de Personnagen.

Regelméisseg Ausdréck erlaben Iech och net-trivial Operatiounen auszeféieren. Op den éischte Bléck ass dës Wëssenschaft net einfach ze beherrschen. Awer an der Praxis ass alles standardiséiert, also ass et genuch fir et eemol erauszefannen, duerno kann dëst Tool net nëmmen am Python benotzt ginn, awer och an all aner Programméierungssprooch. Och Excel benotzt regelméisseg Ausdréck fir d'Dateveraarbechtung ze automatiséieren. Also et ass eng Sënn dëst Tool net ze benotzen.

Hannerlooss eng Äntwert