Escaping av spesialtegn i regex i Python
Anta at vi ønsker at et spesialtegn skal representere seg selv. For å gjøre dette må det escapes med en omvendt skråstrek. La oss se på noen eksempler.
Eksempel
I det følgende eksempelet ønsket forfatteren av regexet at
søkemønsteret skulle se slik ut: bokstaven
'a', deretter plusstegn '+', deretter
bokstaven 'x'. Imidlertid escapte ikke kodeforfatteren
tegnet '+', og derfor
ser søkemønsteret egentlig slik ut:
bokstaven 'a' en eller flere ganger,
så bokstaven 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Resultat av kjøring av koden:
'a+x ! ! !'
Eksempel
Nå har forfatteren escapt plusstegnet med en omvendt
skråstrek. Nå ser søkemønsteret slik ut,
som det skal: bokstaven 'a', deretter plusstegn
'+', deretter bokstaven 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Resultat av kjøring av koden:
'! ax aax aaax'
Eksempel
I dette eksempelet ser mønsteret slik ut:
bokstaven 'a', deretter punktum '.',
deretter bokstaven 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Resultat av kjøring av koden:
'! abx azx'
Eksempel
I det følgende eksempelet glemte forfatteren å escape punktummet, og alle delstrenger ble fanget opp av regexet, fordi et uescapet punktum representerer et hvilket som helst tegn:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Resultat av kjøring av koden:
'! ! !'
Merknad
Legg merke til at hvis du glemmer den omvendte skråstreken for punktum (når det skal representere seg selv) - kan det være vanskelig å legge merke til:
res = re.sub('a.x', '!', 'a.x')
print(res) # returnerer '!', som vi ønsket
Visuelt fungerer det riktig (fordi punktum
representerer et hvilket som helst tegn, inkludert et
vanlig punktum '.'). Men hvis vi endrer
strengen der erstatningene skjer - vil vi
se feilen vår:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # returnerer '! ! !', men forventet var '! abx azx'
Liste over spesialtegn og vanlige tegn
Hvis du escaper et vanlig tegn - vil ingenting alvorlig skje - det vil fortsatt representere seg selv. Unntaket - sifre, de kan ikke escapes.
Det oppstår ofte tvil om et gitt tegn er et spesialtegn. Noen ender opp med å escape alle mistenkelige tegn på rad. Dette er imidlertid en dårlig praksis (rotet til regexet med omvendte skråstreker).
Følgende er spesialtegn: $ ^ . * + ? \ / {} [] () |
Følgende er ikke spesialtegn: @ : , ' " - _ = < > % # ~ `& !
Praktiske oppgaver
Gitt en streng:
txt = 'a.a aba aea'
Skriv et regex som finner strengen
'a.a', uten å fange de andre.
Gitt en streng:
txt = '2+3 223 2223'
Skriv et regex som finner strengen
'2+3', uten å fange de andre.
Gitt en streng:
txt = '23 2+3 2++3 2+++3 345 567'
Skriv et regex som finner strengene
'2+3', '2++3', '2+++3',
uten å fange de andre (+ kan være et hvilket som helst
antall).
Gitt en streng:
txt = '23 2+3 2++3 2+++3 445 677'
Skriv et regex som finner strengene
'23', '2+3', '2++3',
'2+++3', uten å fange de andre.
Gitt en streng:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Skriv et regex som finner strengene
'*q+', '*qq+', '*qqq+',
uten å fange de andre.
Gitt en streng:
txt = '[abc] {abc} abc (abc) [abc]'
Skriv et regex som finner strengene
i klammeparenteser og erstatter dem med
'!'.