Erikoismerkkien escapaus Pythonin regexeissä
Oletetaan, että halutaan, että erikoismerkki tarkoittaa itseään. Tätä varten sitä tulee escapata kenoviivalla. Katsotaanpa esimerkein.
Esimerkki
Seuraavassa esimerkissä regexin tekijä halusi,
että hakumalli näyttäisi tältä: kirjain
'a', sitten plus '+', sitten
kirjain 'x'. Kuitenkin, koodin tekijä
ei escapannut merkkiä '+', joten
hakumalli itse asiassa näyttää tältä:
kirjain 'a' yksi tai useampi kerta,
sitten kirjain 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Koodin suorituksen tulos:
'a+x ! ! !'
Esimerkki
Nyt tekijä on escapannut plus-merkin kenoviivalla.
Nyt hakumalli näyttää halutulta: kirjain
'a', sitten plus '+', sitten
kirjain 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Koodin suorituksen tulos:
'! ax aax aaax'
Esimerkki
Tässä esimerkissä hakumalli näyttää tältä:
kirjain 'a', sitten piste '.',
sitten kirjain 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Koodin suorituksen tulos:
'! abx azx'
Esimerkki
Seuraavassa esimerkissä tekijä unohti escapata pisteen ja regex otti kaikki alimerkkijonot, koska escapaaamaton piste tarkoittaa mitä tahansa merkkiä:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Koodin suorituksen tulos:
'! ! !'
Huomautus
Huomaa, että jos unohdat kenoviivan pisteelle (kun sen pitäisi tarkoittaa itseään) - tätä ei välttämättä edes huomaa:
res = re.sub('a.x', '!', 'a.x')
print(res) # palauttaa '!', kuten halusimmekin
Visuaalisesti toimii oikein (koska piste
tarkoittaa mitä tahansa merkkiä, myös
tavallista pistettä '.'). Mutta jos vaihdat
merkkijonon, jossa korvaukset tapahtuvat - näemme
virheemme:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # palauttaa '! ! !', odotettiin '! abx azx'
Erikoismerkkien ja tavallisten merkkien lista
Jos escapaa tavallisen merkin - mitään kamalaa ei tapahdu - se tarkoittaa silti itseään. Poikkeus - numerot, niitä ei voi escapata.
Usein herää epäilys, onko tietty merkki erikoinen. Jotkut menevät siihen, että escapavat kaikki epäilyttävät merkit peräkkäin. Tämä on kuitenkin huono käytäntö (liottaa regexin kenoviivoilla).
Ovat erikoismerkkejä: $ ^ . * + ? \ / {} [] () |
Eivät ole erikoismerkkejä: @ : , ' " - _ = < > % # ~ `& !
Käytännön tehtävät
Annettu merkkijono:
txt = 'a.a aba aea'
Kirjoita regex, joka löytää merkkijonon
'a.a', ottaen muita.
Annettu merkkijono:
txt = '2+3 223 2223'
Kirjoita regex, joka löytää merkkijonon
'2+3', ottaen muita.
Annettu merkkijono:
txt = '23 2+3 2++3 2+++3 345 567'
Kirjoita regex, joka löytää merkkijonot
'2+3', '2++3', '2+++3',
oattaen muita (+ voi olla mikä tahansa
määrä).
Annettu merkkijono:
txt = '23 2+3 2++3 2+++3 445 677'
Kirjoita regex, joka löytää merkkijonot
'23', '2+3', '2++3',
'2+++3', ottaen muita.
Annettu merkkijono:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Kirjoita regex, joka löytää merkkijonot
'*q+', '*qq+', '*qqq+',
oattaen muita.
Annettu merkkijono:
txt = '[abc] {abc} abc (abc) [abc]'
Kirjoita regex, joka löytää merkkijonot
hakasulkeissa ja korvaa ne
'!':lla.