Bindestrek inni sett i regulære uttrykk i Python
Bindestrek er også et spesialtegn inni [ ]
(men utenfor - ikke). Hvis du trenger selve
bindestreken som et tegn - plasser den der
den ikke vil bli oppfattet som en skilletegn
for en gruppe.
Hvorfor dette er viktig: du kan lage en gruppe
tegn uten å legge merke til det. For eksempel,
slik som dette - '[:-@]' - du tror at du
velger kolon, bindestrek og krøllalfa, men
det som egentlig skjer er at du får en gruppe
tegn mellom : og @. Denne gruppen
inkluderer følgende tegn: ? < = > :
Hvor kommer de fra? Fra ASCII-tabellen - kolon har et lavere nummer enn krøllalfa - og det resulterer i en gruppe. Det vil si at alle grupper oppstår i henhold til ASCII-tabellen (om ønskelig kan man bruke dette).
Hvordan håndtere dette: plasser bindestrektegnet
der det helt sikkert ikke vil bli oppfattet
som et gruppetegn, for eksempel i begynnelsen eller
på slutten (det vil si etter [ eller før
]).
Man kan også escape bindestreken - da
vil den representere seg selv uavhengig
av posisjon. For eksempel, i stedet for [:-@]
skrive [:\-@] - og da vil det ikke være noen
gruppe, men heller tre tegn - kolon,
bindestrek og krøllalfa @.
Eksempel
I følgende eksempel er søkemønsteret som følger:
siffer 1, deretter en bokstav fra 'a'
til 'z', deretter siffer 2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a-z]2', '!', txt)
print(res)
Resultat av kjøring av koden:
'! 1-2 ! !'
Eksempel
La oss nå escape bindestreken. Som
resultat blir søkemønsteret slik: siffer
1, deretter bokstaven 'a', eller
bindestrek, eller bokstaven 'z', deretter siffer
2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a\-z]2', '!', txt)
print(res)
Resultat av kjøring av koden:
'! ! 1c2 !'
Eksempel
Man kan ganske enkelt flytte bindestreken, uten å escape den:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[az-]2', '!', txt)
print(res)
Resultat av kjøring av koden:
'! ! 1c2 !'
Eksempel
I følgende eksempel er søkemønsteret som følger:
første tegn er enten små bokstaver eller
bindestrek '-', deretter to bokstaver
'x':
txt = 'axx Axx -xx @xx'
res = re.sub('[a-z-]xx', '!', txt)
print(res)
Resultat av kjøring av koden:
'! Axx ! @xx'
Eksempel
I følgende eksempel er søkemønsteret som følger:
første tegn er enten små bokstaver, store
bokstaver eller bindestrek '-', deretter to bokstaver
'x':
txt = 'axx Axx -xx @xx'
res = re.sub('[a-zA-Z-]xx', '!', txt)
print(res)
Resultat av kjøring av koden:
'! ! ! @xx'
Eksempel
Man kan plassere bindestreken mellom to grupper - der vil den helt sikkert ikke lage en ny gruppe:
txt = 'axx 9xx -xx @xx'
res = re.sub('[a-z-0-9]xx', '!', txt)
print(res)
Resultat av kjøring av koden:
'! ! ! @xx'
Praktiske oppgaver
Gitt en streng:
txt = 'xaz xBz xcz x-z x@z'
Finn alle strenger som følger dette mønsteret:
bokstaven 'x', stor eller liten
bokstav eller bindestrek, bokstaven 'z'.
Gitt en streng:
txt = 'xaz x$z x-z xcz x+z x%z x*z'
Finn alle strenger som følger dette mønsteret:
bokstaven 'x', deretter enten dollartegn,
bindestrek eller plusstegn, deretter bokstaven 'z'.