Python 3:n Re-moduulin dokumentaatio in . Re-moduuli säännöllisille lausekkeille

Säännölliset lausekkeet ovat erittäin suosittu komponentti melkein kaikissa ohjelmointikielissä. Niiden avulla saat nopeasti tarvitsemasi tiedon. Niitä käytetään erityisesti silloin, kun on tarpeen käsitellä tekstiä. Pythonissa on oletuksena erityinen moduuli. re, joka vastaa säännöllisten lausekkeiden käsittelystä.

Tänään puhumme yksityiskohtaisesti siitä, mitä se yleensä on, kuinka työskennellä heidän kanssaan ja miten moduuli toimii re auttaa.

Säännölliset lausekkeet: johdanto

Mitä säännöllisiä lausekkeita käytetään? Lähes kaikki. Esimerkiksi nämä:

  1. Web-sovellukset, jotka vaativat tekstin vahvistuksen. Tyypillinen esimerkki ovat online-sähköpostiohjelmat.
  2. Kaikki muut projekteihin, jotka liittyvät teksteihin, tietokantoihin ja niin edelleen.

Ennen kuin alamme jäsentää syntaksia, meidän tulisi ymmärtää tarkemmin kirjaston toiminnan perusperiaatteet re ja ylipäätään, mikä siinä yleensä on hyvää. Annamme myös esimerkkejä todellisesta käytännöstä, jossa kuvataan niiden käyttömekanismi. Voit luoda tällaisen mallin, joka sopii sinulle monenlaisten tekstitoimintojen suorittamiseen.

Mikä on Re-kirjaston malli?

Sen avulla voit etsiä erityyppisiä tietoja, saada niitä vastaavia tietoja, jotta muut toiminnot mukautuvat paremmin. Ja tietysti näiden tietojen käsittelyyn.

Ota esimerkiksi seuraava malli: s+. Se tarkoittaa mitä tahansa välilyöntimerkkiä. Jos lisäät siihen plusmerkin, tämä tarkoittaa, että kuvio sisältää useamman kuin yhden välilyönnin. Se voi jopa vastata sarkainmerkkejä, joilla kutsutaan t+.

Ennen kuin käytät niitä, sinun on tuotava kirjasto Re. Sen jälkeen käytämme erityistä komentoa mallin kääntämiseen. Tämä tehdään kahdessa vaiheessa.

>>> tuonti re

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

Erityisesti tämä koodi suorittaa käytettävän mallin kääntämisen. esimerkiksi välilyöntien etsimiseen (yksi tai useampia).

Erillisten tietojen saaminen eri merkkijonoista säännöllisten lausekkeiden avulla

Oletetaan, että meillä on muuttuja, joka sisältää seuraavat tiedot.

>>> teksti = “””100 INF Informatiikka

213 MAT Matematiikka  

156 FIN Englanti»»»

Se sisältää kolme koulutusta. Jokainen niistä koostuu kolmesta osasta – numerosta, koodista ja nimestä. Näemme, että näiden sanojen välinen aika on erilainen. Mitä tehdä, jotta tämä rivi jaetaan erillisiksi numeroiksi ja sanoiksi? Tämän tavoitteen saavuttamiseksi on kaksi tapaa:

  1. kutsua funktiota uudelleen.
  2. soveltaa toimintoa jakaa varten regex.

Tässä on esimerkki kunkin muuttujamme menetelmän syntaksin käytöstä.

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

# tai

>>> regex.split(teksti)

Lähtö: ['100', 'INF', 'Computer Science', '213', 'MAT', 'Math', '156', 'ENG', 'English']

Yleensä molempia menetelmiä voidaan käyttää. Mutta itse asiassa on paljon helpompaa käyttää säännöllistä lauseketta sen sijaan, että käyttäisit funktiota useita kertoja. uudelleen.

Etsiä osumia kolmella funktiolla

Oletetaan, että meidän täytyy poimia vain numeroita merkkijonosta. Mitä tälle pitää tehdä?

re.findall()

Tässä on funktion käyttötapaus löydä kaikki (), jonka avulla voit yhdessä säännöllisten lausekkeiden kanssa poimia yhden tai useamman luvun esiintymät tekstimuuttujasta.

>>> tulosta (teksti)  

100 INF Informatiikka

213 MAT Matematiikka  

156 FIN Englanti

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

>>> regex_num.findall(teksti)  

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

Yhdessä d-symbolin kanssa käytimme mallia, joka ilmaisee ehdottomasti minkä tahansa muuttujassa tai tekstissä olevan numeerisen arvon. Ja koska lisäsimme sinne yhden +, tämä tarkoittaa, että vähintään yhden numeron on oltava läsnä. 

Voit myös käyttää *-merkkiä määrittääksesi, että numeron läsnäolo ei vaadi vastaavuuden löytämistä.

Mutta meidän tapauksessamme, koska käytimme +, purimme kanssa löydä kaikki () 1 tai useampi kurssien digitaalinen nimitys tekstistä. Näin ollen meidän tapauksessamme säännölliset lausekkeet toimivat funktion asetuksina.

re.search() vs re.match()

Kuten funktioiden nimestä voi päätellä, ensimmäinen etsii vastaavuutta tekstistä. Kysymys: Mitä eroa on löytyykö kaikki? Asia on siinä, että se palauttaa tietyn objektin, joka vastaa kuviota, eikä koko löydettyjen tulosten sarjaa luettelon muodossa, kuten edellinen funktio.

Re.match-toiminto puolestaan ​​tekee saman. Vain syntaksi on erilainen. Malli tulee sijoittaa alkuun. 

Otetaan esimerkki, joka osoittaa tämän.

>>> # luo muuttuja tekstillä

>>> text2 = «»»INF Informatiikka

213 MAT Matematiikka 156″»»  

>>> # kokoa regex ja etsi malleja

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

>>> s = regex_num.search(teksti2)  

>>> print('Ensimmäinen indeksi:', s.start())  

>>> print('Viimeinen indeksi:', s.end())  

>>> tulosta(teksti2[s.aloitus():s.end()]) 

Ensimmäinen indeksi: 17 

Viimeisin indeksi: 20

213

Jos haluat saada samanlaisen tuloksen eri tavalla, voit käyttää toimintoa ryhmä().

Tekstin osan korvaaminen Re-kirjastolla

Käytä toimintoa tekstin korvaamiseksi re.sub(). Oletetaan, että kurssiluettelomme on hieman muuttunut. Näemme, että jokaisen digitaalisen arvon jälkeen meillä on välilehti. Tehtävämme on yhdistää kaikki tämä sarja yhdeksi riviksi. Tätä varten meidän on korvattava lauseke s+ ohittaa 

Alkuperäinen teksti oli:

# luo muuttuja tekstillä

>>> teksti = “””100 INF t Informatiikka

213 MAT t Matematiikka  

156 FIN t Englanti»»»  

>>> tulosta (teksti)  

100 TIETOA tietotekniikka

213 XNUMX XNUMX MAT Matematiikka  

156 ANG Englanti

Halutun toiminnon suorittamiseksi käytimme seuraavia koodirivejä.

# korvaa yksi tai useampi välilyönti 1:llä

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

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

Tämän seurauksena meillä on yksi rivi. 

101 COM Tietokoneet 205 MAT Matematiikka 189 FIN Englanti

Mieti nyt toista ongelmaa. Meidän ei tarvitse asettaa välilyöntejä. Meille on paljon tärkeämpää, että kaikki kurssien nimet alkavat uudella rivillä. Tätä varten käytetään toista lauseketta, joka lisää poikkeukseen rivinvaihdon. Millainen ilmaisu tämä on?

Kirjasto Re tukee ominaisuutta, kuten negatiivista hakua. Se eroaa suorasta siinä, että se sisältää huutomerkin ennen kauttaviivaa. Eli jos meidän on ohitettava rivinvaihtomerkki, meidän on kirjoitettava !n n:n sijaan.

Saamme seuraavan koodin.

# poista kaikki välilyönnit paitsi rivinvaihto  

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

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

100 INF Informatiikka

213 MAT Matematiikka  

156 FIN Englanti

Mitä ovat säännöllisten lausekkeiden ryhmät?

Säännöllisten lausekkeiden ryhmien avulla saamme halutut objektit erillisinä elementteinä, ei yhdellä rivillä. 

Oletetaan, että meidän ei tarvitse saada kurssin numeroa, koodia ja nimeä yhdelle riville, vaan erillisinä elementteinä. Tehtävän suorittamiseksi sinun on kirjoitettava valtava määrä tarpeettomia koodirivejä. 

Itse asiassa tehtävää voidaan yksinkertaistaa huomattavasti. Voit koota mallin kaikille merkinnöille ja määrittää vain tiedot, jotka sinun tulee saada suluista.

Rivejä tulee olemaan hyvin pieni määrä. 

# luo ryhmiä kurssin tekstimalleista ja pura ne

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

>>> re.findall(kurssimalli, teksti)  

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

"Ahneen" sovituksen käsite

Normaalisti säännölliset lausekkeet on ohjelmoitu poimimaan mahdollisimman paljon vastaavaa dataa. Ja vaikka tarvitset paljon vähemmän.

Katsotaanpa esimerkkiä HTML-koodista, josta meidän on hankittava tunniste.

>>> text = "Esimerkki ahneesta säännöllisestä lausekkeesta"  

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

['Esimerkki ahneesta säännöllisestä lausekkeesta']

Sen sijaan, että olisi poiminut vain yhden tagin, Python sai koko merkkijonon. Siksi sitä kutsutaan ahneeksi.

Ja mitä tehdä saadaksesi vain tunnisteen? Tässä tapauksessa sinun on käytettävä laiskaa sovitusta. Tällaisen lausekkeen määrittämiseksi kuvion loppuun lisätään kysymysmerkki.

Saat seuraavan koodin ja tulkin tulosteen.

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

[”, ”]

Jos vaaditaan vain ensimmäinen havaittu esiintymä, käytetään menetelmää Hae ().

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

"

Silloin vain avaustunniste löytyy.

Suositut lausekemallit

Tässä on taulukko, joka sisältää yleisimmin käytetyt säännölliset lausekkeet.

Python 3:n Re-moduulin dokumentaatio in . Re-moduuli säännöllisille lausekkeille

Yhteenveto

Olemme tarkastelleet vain perusmenetelmiä säännöllisten lausekkeiden kanssa työskentelyyn. Joka tapauksessa olet nähnyt, kuinka tärkeitä ne ovat. Ja tässä ei ole väliä, onko tarpeen jäsentää koko teksti vai sen yksittäiset fragmentit, onko tarpeen analysoida viesti sosiaalisessa verkostossa vai kerätä tietoja sen käsittelemiseksi myöhemmin. Säännölliset lausekkeet ovat luotettava apu tässä asiassa.

Niiden avulla voit suorittaa tehtäviä, kuten:

  1. Tietojen muodon, kuten sähköpostiosoitteen tai puhelinnumeron, määrittäminen.
  2. Merkkijonon hankkiminen ja sen jakaminen useiksi pienemmiksi merkkijonoiksi.
  3. Suorita tekstin kanssa erilaisia ​​toimintoja, kuten etsiminen, tarvittavien tietojen poimiminen tai osan merkin korvaaminen.

Säännöllisten lausekkeiden avulla voit myös suorittaa ei-triviaaleja operaatioita. Ensi silmäyksellä tämän tieteen hallitseminen ei ole helppoa. Mutta käytännössä kaikki on standardoitua, joten riittää, että se selvitetään kerran, minkä jälkeen tätä työkalua voidaan käyttää paitsi Pythonissa, myös millä tahansa muulla ohjelmointikielellä. Jopa Excel käyttää säännöllisiä lausekkeita tietojenkäsittelyn automatisointiin. Joten on synti olla käyttämättä tätä työkalua.

Jätä vastaus