Escaperen van speciale tekens in Python regex
Stel dat we willen dat een speciaal teken zichzelf vertegenwoordigt. Om dit te bereiken moet het geëscaped worden met een backslash. Laten we eens kijken naar voorbeelden.
Voorbeeld
In het volgende voorbeeld wilde de auteur van de regex
dat het zoekpatroon er als volgt uitzag: letter
'a', dan een plus '+', dan
letter 'x'. De auteur van de code
heeft het teken '+' echter niet geëscaped en daarom
ziet het zoekpatroon er in werkelijkheid als volgt uit:
letter 'a' een of meer keer,
dan letter 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Resultaat van de code-uitvoering:
'a+x ! ! !'
Voorbeeld
En nu heeft de auteur de plus geëscaped met een
backslash. Nu ziet het zoekpatroon er uit
zoals bedoeld: letter 'a', dan plus
'+', dan letter 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Resultaat van de code-uitvoering:
'! ax aax aaax'
Voorbeeld
In dit voorbeeld ziet het patroon er als volgt uit:
letter 'a', dan punt '.',
dan letter 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Resultaat van de code-uitvoering:
'! abx azx'
Voorbeeld
In het volgende voorbeeld vergat de auteur de punt te escapen en trof de regex alle substrings, omdat een niet-geëscapte punt staat voor elk willekeurig teken:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Resultaat van de code-uitvoering:
'! ! !'
Opmerking
Let op dat als je de backslash voor de punt vergeet (wanneer de punt zichzelf moet vertegenwoordigen) - dit zelfs onopgemerkt kan blijven:
res = re.sub('a.x', '!', 'a.x')
print(res) # retourneert '!', zoals we wilden
Visueel werkt het correct (omdat de punt
voor elk willekeurig teken staat, inclusief een
gewone punt '.'). Maar als we de
string veranderen waarin de vervangingen plaatsvinden - dan
zien we onze fout:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # retourneert '! ! !', maar werd verwacht '! abx azx'
Lijst van speciale tekens en gewone tekens
Als je een gewoon teken escapest - gebeurt er niets ergs - het zal nog steeds zichzelf vertegenwoordigen. Uitzondering - cijfers, deze kunnen niet geëscaped worden.
Vaak bestaat er twijfel of een bepaald teken speciaal is. Sommigen gaan zo ver dat ze alle verdachte tekens achter elkaar escapen. Dit is echter een slechte gewoonte (vervuilt de regex met backslashes).
Speciale tekens zijn: $ ^ . * + ? \ / {} [] () |
Geen speciale tekens zijn: @ : , ' " - _ = < > % # ~ `& !
Praktische taken
Gegeven de string:
txt = 'a.a aba aea'
Schrijf een regex die de string
'a.a' vindt, zonder de anderen te pakken.
Gegeven de string:
txt = '2+3 223 2223'
Schrijf een regex die de string
'2+3' vindt, zonder de anderen te pakken.
Gegeven de string:
txt = '23 2+3 2++3 2+++3 345 567'
Schrijf een regex die de strings
'2+3', '2++3', '2+++3' vindt,
zonder de anderen te pakken (+ kan elk
aantal zijn).
Gegeven de string:
txt = '23 2+3 2++3 2+++3 445 677'
Schrijf een regex die de strings
'23', '2+3', '2++3',
'2+++3' vindt, zonder de anderen te pakken.
Gegeven de string:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Schrijf een regex die de strings
'*q+', '*qq+', '*qqq+' vindt,
zonder de anderen te pakken.
Gegeven de string:
txt = '[abc] {abc} abc (abc) [abc]'
Schrijf een regex die de strings
in vierkante haakjes vindt en ze vervangt door
'!'.