Escaping af specialtegn i Python regex
Antag, at vi skal gøre sådan, at et specialtegn betyder sig selv. For at gøre dette skal det escapes med et omvendt skråstreg. Lad os se på eksempler.
Eksempel
I det følgende eksempel ønskede forfatteren af regexet,
at søgemønstret skulle se sådan ud: bogstavet
'a', derefter plus '+', derefter
bogstavet 'x'. Men forfatteren af koden
escapede ikke tegnet '+', og derfor
ser søgemønstret faktisk sådan ud:
bogstavet 'a' en eller flere gange,
derefter bogstavet 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Resultatet af kodeudførelsen:
'a+x ! ! !'
Eksempel
Og i dette eksempel escapede forfatteren plustegnet med et omvendt
skråstreg. Nu ser søgemønstret ud, som det skal: bogstavet
'a', derefter plus
'+', derefter bogstavet 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Resultatet af kodeudførelsen:
'! ax aax aaax'
Eksempel
I dette eksempel ser mønstret sådan ud:
bogstavet 'a', derefter punktum '.',
derefter bogstavet 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Resultatet af kodeudførelsen:
'! abx azx'
Eksempel
I det følgende eksempel glemte forfatteren at escape skråstregen, og under regexet faldt alle delstrenge, da en ikke-escaped punktum betyder ethvert tegn:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Resultatet af kodeudførelsen:
'! ! !'
Bemærkning
Læg mærke til, at hvis du glemmer det omvendte skråstreg for punktum (når det skal betyde sig selv) - kan det være svært at opdage:
res = re.sub('a.x', '!', 'a.x')
print(res) # returnerer '!', som vi ønskede
Visuelt fungerer det korrekt (da punktum
betyder ethvert tegn, inklusive
et almindeligt punktum '.'). Men hvis vi ændrer
strengen, hvor der foretages erstatninger - vil vi
se vores fejl:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # returnerer '! ! !', men forventet var '! abx azx'
Liste over specialtegn og almindelige tegn
Hvis man escape et almindeligt tegn - sker der ikke noget skrækkeligt - det vil stadig betyde sig selv. Undtagelsen er cifre, de kan ikke escapes.
Ofte opstår der tvivl om, hvorvidt et givet tegn er et specialtegn. Nogle kommer så langt som at escape alle mistænkelige tegn i træk. Dette er dog en dårlig praksis (roder regexet til med omvendte skråstreger).
Følgende er specialtegn: $ ^ . * + ? \ / {} [] () |
Følgende er ikke specialtegn: @ : , ' " - _ = < > % # ~ `& !
Praktiske opgaver
Givet strengen:
txt = 'a.a aba aea'
Skriv et regulært udtryk, der finder strengen
'a.a', uden at fange de andre.
Givet strengen:
txt = '2+3 223 2223'
Skriv et regulært udtryk, der finder strengen
'2+3', uden at fange de andre.
Givet strengen:
txt = '23 2+3 2++3 2+++3 345 567'
Skriv et regulært udtryk, der finder strengene
'2+3', '2++3', '2+++3',
uden at fange de andre (+ kan være et vilkårligt
antal).
Givet strengen:
txt = '23 2+3 2++3 2+++3 445 677'
Skriv et regulært udtryk, der finder strengene
'23', '2+3', '2++3',
'2+++3', uden at fange de andre.
Givet strengen:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Skriv et regulært udtryk, der finder strengene
'*q+', '*qq+', '*qqq+',
uden at fange de andre.
Givet strengen:
txt = '[abc] {abc} abc (abc) [abc]'
Skriv et regulært udtryk, der finder strengene
i kantede parenteser og erstatter dem med
'!'.