Escapering av specialtecken i Pythons reguljära uttryck
Antag att vi behöver göra så att ett specialtecken representerar sig självt. För att göra detta ska det escapes med ett omvänt snedstreck. Låt oss titta på exempel.
Exempel
I följande exempel ville författaren till det reguljära uttrycket
att sökmönstret skulle se ut så här: bokstaven
'a', sedan ett plus '+', sedan
bokstaven 'x'. Men författaren av koden
escade inte tecknet '+' och därför
ser sökmönstret i verkligheten ut så här:
bokstaven 'a' en eller flera gånger,
sedan bokstaven 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Resultat av kodkörning:
'a+x ! ! !'
Exempel
Och nu har författaren escapat plus-tecknet med ett omvänt
snedstreck. Nu ser sökmönstret ut så som
det ska: bokstaven 'a', sedan plus
'+', sedan bokstaven 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Resultat av kodkörning:
'! ax aax aaax'
Exempel
I detta exempel ser mönstret ut så här:
bokstaven 'a', sedan en punkt '.',
sedan bokstaven 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Resultat av kodkörning:
'! abx azx'
Exempel
I nästa exempel glömde författaren att escapa snedstrecket och alla delsträngar träffades av det reguljära uttrycket, eftersom en oescaped punkt representerar vilket tecken som helst:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Resultat av kodkörning:
'! ! !'
Anmärkning
Notera att om du glömmer det omvända snedstrecket för en punkt (när den ska representera sig själv) - kan detta gå obemärkt förbi:
res = re.sub('a.x', '!', 'a.x')
print(res) # returnerar '!', som vi ville
Visuellt fungerar det korrekt (eftersom punkten
representerar vilket tecken som helst, inklusive en
vanlig punkt '.'). Men om vi ändrar
strängen där ersättningarna sker - kommer vi
se vårt misstag:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # returnerar '! ! !', men förväntat var '! abx azx'
Lista över specialtecken och vanliga tecken
Om man escapar ett vanligt tecken - händer inget hemskt - det kommer fortfarande att representera sig självt. Undantaget är siffror, de kan inte escapes.
Ofta uppstår tvivel om ett visst tecken är ett specialtecken. Vissa kommer så långt att de escapar alla misstänkta tecken i rad. Detta är dock dålig praxis (förorenar det reguljära uttrycket med omvända snedstreck).
Specialtecken är: $ ^ . * + ? \ / {} [] () |
Är inte specialtecken: @ : , ' " - _ = < > % # ~ `& !
Praktiska uppgifter
Given en sträng:
txt = 'a.a aba aea'
Skriv ett reguljärt uttryck som hittar strängen
'a.a', utan att fånga de andra.
Given en sträng:
txt = '2+3 223 2223'
Skriv ett reguljärt uttryck som hittar strängen
'2+3', utan att fånga de andra.
Given en sträng:
txt = '23 2+3 2++3 2+++3 345 567'
Skriv ett reguljärt uttryck som hittar strängarna
'2+3', '2++3', '2+++3',
utan att fånga de andra (+ kan vara vilket
antal som helst).
Given en sträng:
txt = '23 2+3 2++3 2+++3 445 677'
Skriv ett reguljärt uttryck som hittar strängarna
'23', '2+3', '2++3',
'2+++3', utan att fånga de andra.
Given en sträng:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Skriv ett reguljärt uttryck som hittar strängarna
'*q+', '*qq+', '*qqq+',
utan att fånga de andra.
Given en sträng:
txt = '[abc] {abc} abc (abc) [abc]'
Skriv ett reguljärt uttryck som hittar strängarna
i hakparenteser och ersätter dem med
'!'.