Bindestreg i sæt i Python regex
Bindestreg - også et specialtegn inde i [ ]
(men udenfor - ikke). Hvis du skal bruge selve
bindestregen som symbol - så placer den der,
hvor den ikke vil blive opfattet som en gruppeseparator.
Hvorfor det er vigtigt: du kan utilsigtet lave en gruppe
af symboler. For eksempel,
sådan her - '[:-@]' - tror du, at du
vælger kolon, bindestreg og at-symbol, men
i virkeligheden får du en gruppe af symboler mellem
: og @. Denne gruppe inkluderer
følgende symboler: ? < = > :
Hvor kommer de fra? Fra ASCII-tabellen - kolon har et lavere nummer end at-symbol - og det resulterer i en gruppe. Det vil sige, alle grupper opstår baseret på ASCII-tabellen (hvis ønsket, kan man bruge dette til sin fordel).
Hvad man gør ved det: placer symbolet
bindestreg der, hvor den helt sikkert ikke vil blive opfattet
som en gruppeseparator, for eksempel i starten eller
i slutningen (altså efter [ eller før
]).
Man kan også escape bindestregen - så
vil den altid repræsentere sig selv uanset
position. For eksempel, i stedet for [:-@]
skrive [:\-@] - og så vil der ikke være nogen gruppe,
men der vil være tre symboler - kolon,
bindestreg og at-symbol @.
Eksempel
I det følgende eksempel er søgemønsteret sådan:
ciffer 1, derefter bogstav fra 'a'
til 'z', derefter ciffer 2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a-z]2', '!', txt)
print(res)
Resultat af kodeudførelse:
'! 1-2 ! !'
Eksempel
Lad os nu escape bindestregen. Som
resultat er søgemønsteret sådan: ciffer
1, derefter bogstav 'a', eller
bindestreg, eller bogstav 'z', derefter ciffer
2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a\-z]2', '!', txt)
print(res)
Resultat af kodeudførelse:
'! ! 1c2 !'
Eksempel
Man kan blot flytte bindestregen, uden at escape den:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[az-]2', '!', txt)
print(res)
Resultat af kodeudførelse:
'! ! 1c2 !'
Eksempel
I det følgende eksempel er søgemønsteret sådan:
første symbol er enten små bogstaver eller
bindestreg '-', derefter to bogstaver
'x':
txt = 'axx Axx -xx @xx'
res = re.sub('[a-z-]xx', '!', txt)
print(res)
Resultat af kodeudførelse:
'! Axx ! @xx'
Eksempel
I det følgende eksempel er søgemønsteret sådan:
første symbol er enten små, store
bogstaver eller bindestreg '-', derefter to bogstaver
'x':
txt = 'axx Axx -xx @xx'
res = re.sub('[a-zA-Z-]xx', '!', txt)
print(res)
Resultat af kodeudførelse:
'! ! ! @xx'
Eksempel
Man kan placere bindestregen mellem to grupper - der vil den helt sikkert ikke lave endnu en gruppe:
txt = 'axx 9xx -xx @xx'
res = re.sub('[a-z-0-9]xx', '!', txt)
print(res)
Resultat af kodeudførelse:
'! ! ! @xx'
Praktiske opgaver
Givet en streng:
txt = 'xaz xBz xcz x-z x@z'
Find alle strenge efter følgende mønster:
bogstav 'x', stort eller lille
bogstav eller bindestreg, bogstav 'z'.
Givet en streng:
txt = 'xaz x$z x-z xcz x+z x%z x*z'
Find alle strenge efter følgende mønster:
bogstav 'x', derefter enten dollar, eller
bindestreg eller plus, derefter bogstav 'z'.