Documentatie voor de Re-module voor Python 3 in . Re-module voor reguliere expressies

Reguliere expressies zijn een zeer populair onderdeel van bijna elke programmeertaal. Ze helpen je snel toegang te krijgen tot de informatie die je nodig hebt. Ze worden met name gebruikt wanneer het nodig is om tekst te verwerken. Python wordt standaard geleverd met een speciale module. re, die verantwoordelijk is voor het werken met reguliere expressies.

Vandaag zullen we in detail praten over wat het in het algemeen is, hoe ermee te werken en hoe de module re zal helpen.

Reguliere expressies: een introductie

Wat zijn de toepassingen van reguliere expressies? Bijna alle. Bijvoorbeeld deze:

  1. Webapplicaties die tekstvalidatie vereisen. Een typisch voorbeeld zijn online mailclients.
  2. Alle andere projecten met betrekking tot teksten, databases enzovoort.

Voordat we beginnen met het ontleden van de syntaxis, moeten we de basisprincipes van het functioneren van de bibliotheek in meer detail begrijpen re en in het algemeen, wat er over het algemeen goed aan is. We zullen ook voorbeelden uit de praktijk geven, waar we het mechanisme van hun gebruik zullen beschrijven. U kunt zo'n sjabloon maken, geschikt voor u om een ​​breed scala aan bewerkingen met tekst uit te voeren.

Wat is een sjabloon in de Re-bibliotheek?

Hiermee kunt u naar verschillende soorten informatie zoeken, informatie krijgen die daarmee overeenkomt, om andere functies adaptiever te maken. En natuurlijk om deze gegevens te verwerken.

Neem bijvoorbeeld het volgende sjabloon: s+. Het betekent elk spatieteken. Als u er een plusteken aan toevoegt, betekent dit dat het patroon meer dan één spatie bevat. Het kan zelfs overeenkomen met tabtekens die worden aangeroepen met t+.

Voordat u ze kunt gebruiken, moet u de bibliotheek importeren Re. Daarna gebruiken we een speciaal commando om de sjabloon te compileren. Dit gebeurt in twee stappen.

>>> import re

>>> regex = opnieuw compileren('s+')

In het bijzonder voert deze code de bewerking uit van het compileren van een sjabloon die kan worden gebruikt. bijvoorbeeld om te zoeken naar spaties (een of meer).

Afzonderlijke informatie uit verschillende tekenreeksen halen met behulp van reguliere expressies

Stel dat we een variabele hebben die de volgende informatie bevat.

>>> tekst = “””100 INF Informatica

213 MAT Wiskunde  

156 NL Nederlands»»»

Het bevat drie trainingen. Elk van hen bestaat uit drie delen: nummer, code en naam. We zien dat het interval tussen deze woorden verschillend is. Wat te doen om deze regel in afzonderlijke cijfers en woorden te splitsen? Er zijn twee methoden om dit doel te bereiken:

  1. een functie aanroepen opnieuw splitsen.
  2. functie toepassen spleet For regex.

Hier is een voorbeeld van het gebruik van de syntaxis van elk van de methoden voor onze variabele.

>>> opnieuw splitsen('s+', tekst)  

# of

>>> regex.split(tekst)

Uitgang: ['100', 'INF', 'Computer Science', '213', 'MAT', 'Math', '156', 'ENG', 'English']

In het algemeen kunnen beide methoden worden gebruikt. Maar het is eigenlijk veel gemakkelijker om een ​​reguliere expressie te gebruiken in plaats van de functie meerdere keren te gebruiken. opnieuw splitsen.

Matches vinden met drie functies

Laten we zeggen dat we alleen getallen uit een string moeten halen. Wat moet hiervoor worden gedaan?

her.findall()

Hier is een use-case voor de functie: vind alle(), waarmee u, samen met reguliere expressies, exemplaren van een of meer getallen uit een tekstvariabele kunt extraheren.

>>> afdrukken (tekst)  

100 INF Informatica

213 MAT Wiskunde  

156 DUT Engels

>>> regex_num = opnieuw compileren('d+')  

>>> regex_num.findall(tekst)  

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

Samen met het d-symbool hebben we een sjabloon gebruikt die absoluut elke numerieke waarde in een variabele of tekst aangeeft. En aangezien we daar één + hebben toegevoegd, betekent dit dat er minimaal één cijfer aanwezig moet zijn. 

U kunt ook het *-teken gebruiken om aan te geven dat de aanwezigheid van een cijfer niet vereist is om een ​​overeenkomst te vinden.

Maar in ons geval, omdat we + gebruikten, hebben we geëxtraheerd met vind alle() 1 of meer digitale aanduidingen van vakken uit de tekst. In ons geval fungeren reguliere expressies dus als instellingen voor de functie.

re.search() vs opnieuw match()

Zoals je aan de naam van de functies kunt raden, zoekt de eerste naar een match in de tekst. Vraag: Wat is het verschil tussen? vind alle? Het punt is dat het een specifiek object retourneert dat overeenkomt met het patroon, en niet de hele reeks gevonden resultaten in de vorm van een lijst, zoals de vorige functie.

Op zijn beurt doet de re.match-functie hetzelfde. Alleen de syntaxis is anders. De sjabloon moet aan het begin worden geplaatst. 

Laten we een voorbeeld nemen dat dit aantoont.

>>> # maak een variabele met tekst

>>> text2 = «»»INF Informatica

213 MAT Wiskunde 156″»»  

>>> # compileer regex en zoek naar patronen

>>> regex_num = opnieuw compileren('d+')  

>>> s = regex_num.search(text2)  

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

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

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

Eerste index: 17 

Laatste index: 20

213

Als u op een andere manier een vergelijkbaar resultaat wilt krijgen, kunt u de functie gebruiken groep().

Een deel van de tekst vervangen door Re bibliotheek

Gebruik de functie om tekst te vervangen: re.sub(). Stel dat onze lijst met cursussen een beetje is gewijzigd. We zien dat we na elke digitale waarde een tabblad hebben. Het is onze taak om al deze reeksen in één regel te combineren. Om dit te doen, moeten we de uitdrukking s+ . vervangen door te geven 

De originele tekst was:

# maak een variabele met tekst

>>> tekst = “””100 INF t Informatica

213 MAT t Wiskunde  

156 DUT t Nederlands»»»  

>>> afdrukken (tekst)  

100 INFO Informatica

213 MAT Wiskunde  

156 DUT Engels

Om de gewenste bewerking uit te voeren, hebben we de volgende regels code gebruikt.

# vervang een of meer spaties door 1

>>> regex = opnieuw compileren('s+')  

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

Hierdoor hebben we één regel. 

101 COM Computers 205 MAT Wiskunde 189 DUT Engels

Overweeg nu een ander probleem. We staan ​​niet voor de taak om ruimtes te plaatsen. Voor ons is het veel belangrijker dat alle cursusnamen op een nieuwe regel beginnen. Om dit te doen, wordt een andere expressie gebruikt die een nieuwe regel aan de uitzondering toevoegt. Wat voor uitdrukking is dit?

Bibliotheek Re ondersteunt een functie zoals negatieve matching. Het verschilt van het directe doordat het een uitroepteken voor de schuine streep bevat. Dat wil zeggen, als we het teken van de nieuwe regel moeten overslaan, dan moeten we !n schrijven in plaats van n.

We krijgen de volgende code.

# verwijder alle spaties behalve newline  

>>> regex = opnieuw compileren('((?!n)s+)')  

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

100 INF Informatica

213 MAT Wiskunde  

156 DUT Engels

Wat zijn reguliere expressiegroepen?

Met behulp van groepen reguliere expressies kunnen we de gewenste objecten in de vorm van afzonderlijke elementen krijgen, en niet in één regel. 

Stel dat we het cursusnummer, de code en de naam niet op één regel moeten krijgen, maar als aparte elementen. Om de taak te voltooien, moet u een groot aantal onnodige regels code schrijven. 

In feite kan de taak sterk worden vereenvoudigd. U kunt de sjabloon voor alle vermeldingen samenstellen en gewoon de gegevens specificeren die u tussen de haakjes moet halen.

Er zullen een zeer klein aantal lijnen zijn. 

# maak groepen cursustekstsjablonen en extraheer ze

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

>>> re.findall(cursuspatroon, tekst)  

[('100', 'INF', 'Informatica'), ('213', 'MAT', 'Math'), ('156', 'ENG', 'Engels')]

Het concept van "hebzuchtig" matchen

Standaard zijn reguliere expressies geprogrammeerd om de maximale hoeveelheid overeenkomende gegevens te extraheren. En ook als je veel minder nodig hebt.

Laten we eens kijken naar een voorbeeld-HTML-code waar we de tag moeten krijgen.

>>> text = "Voorbeeld van hebzuchtige afstemming van reguliere expressies"  

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

['Voorbeeld van hebzuchtige afstemming van reguliere expressies']

In plaats van slechts één tag te extraheren, kreeg Python de hele string. Daarom wordt het hebzuchtig genoemd.

En wat te doen om alleen de tag te krijgen? In dit geval moet u luie matching gebruiken. Om een ​​dergelijke uitdrukking te specificeren, wordt een vraagteken aan het einde van het patroon toegevoegd.

U krijgt de volgende code en de uitvoer van de interpreter.

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

[", "]

Als het nodig is om alleen het eerste gevonden exemplaar te krijgen, wordt de methode gebruikt zoeken ().

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

"

Dan wordt alleen de openingstag gevonden.

Populaire expressiesjablonen

Hier is een tabel met de meest gebruikte reguliere expressiepatronen.

Documentatie voor de Re-module voor Python 3 in . Re-module voor reguliere expressies

Conclusie

We hebben alleen de meest elementaire methoden overwogen om met reguliere expressies te werken. Je hebt in ieder geval gezien hoe belangrijk ze zijn. En hier maakt het niet uit of het nodig is om de hele tekst of de afzonderlijke fragmenten te ontleden, of het nodig is om een ​​bericht op een sociaal netwerk te analyseren of gegevens te verzamelen om het later te verwerken. Reguliere expressies zijn hierbij een betrouwbare hulp.

Hiermee kunt u taken uitvoeren zoals:

  1. Het formaat van de gegevens opgeven, zoals een e-mailadres of telefoonnummer.
  2. Een string krijgen en deze opsplitsen in verschillende kleinere strings.
  3. Voer verschillende bewerkingen uit met tekst, zoals zoeken, de benodigde informatie extraheren of een deel van de tekens vervangen.

Met reguliere expressies kunt u ook niet-triviale bewerkingen uitvoeren. Op het eerste gezicht is het niet eenvoudig om deze wetenschap onder de knie te krijgen. Maar in de praktijk is alles gestandaardiseerd, dus het volstaat om het een keer uit te zoeken, waarna deze tool niet alleen in Python kan worden gebruikt, maar ook in elke andere programmeertaal. Zelfs Excel gebruikt reguliere expressies om gegevensverwerking te automatiseren. Het is dus zonde om deze tool niet te gebruiken.

Laat een reactie achter