Myślnik wewnątrz zbiorów w wyrażeniach regularnych Pythona
Myślnik - też jest znakiem specjalnym wewnątrz [ ]
(ale na zewnątrz - nie). Jeśli potrzebujesz samego
myślnika jako symbolu - umieść go tam,
gdzie nie zostanie odebrany jako separator
grup.
Dlaczego to ważne: możesz utworzyć grupę
symboli, sam tego nie zauważając. Na przykład,
tak - '[:-@]' - myślisz, że
wybierasz dwukropek, myślnik i małpę, a w
rzeczywistości otrzymujesz grupę symboli między
: a @. W skład tej grupy wchodzą
następujące znaki: ? < = > :
Skąd się wzięły? Z tabeli ASCII - dwukropek ma mniejszy numer niż małpa - i powstaje grupa. Czyli wszystkie grupy powstają według tabeli ASCII (w razie potrzeby można z tego korzystać).
Jak z tym walczyć: umieść symbol
myślnika tam, gdzie na pewno nie zostanie odebrany
jako symbol grupy, na przykład, na początku lub
na końcu (czyli po [lub przed
]).
Można również wyescapować myślnik - wtedy
będzie on oznaczał samego siebie niezależnie
od pozycji. Na przykład, zamiast [:-@]
napisać [:\-@] - i grupy już
nie będzie, a będą trzy symbole - dwukropek,
myślnik i małpa @.
Przykład
W następującym przykładzie wzorzec wyszukiwania jest taki:
cyfra 1, następnie litera od 'a'
do 'z', następnie cyfra 2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a-z]2', '!', txt)
print(res)
Wynik wykonania kodu:
'! 1-2 ! !'
Przykład
Teraz wyescapujmy myślnik. W
wyniku wzorzec wyszukiwania jest taki: cyfra
1, następnie litera 'a', lub
myślnik, lub litera 'z', następnie cyfra
2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a\-z]2', '!', txt)
print(res)
Wynik wykonania kodu:
'! ! 1c2 !'
Przykład
Można po prostu przesunąć myślnik, nie escapując go:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[az-]2', '!', txt)
print(res)
Wynik wykonania kodu:
'! ! 1c2 !'
Przykład
W następującym przykładzie wzorzec wyszukiwania jest taki:
pierwszy symbol - to małe litery lub
myślnik '-', potem dwie litery
'x':
txt = 'axx Axx -xx @xx'
res = re.sub('[a-z-]xx', '!', txt)
print(res)
Wynik wykonania kodu:
'! Axx ! @xx'
Przykład
W następującym przykładzie wzorzec wyszukiwania jest taki:
pierwszy symbol - to małe, duże
litery lub myślnik '-', potem dwie litery
'x':
txt = 'axx Axx -xx @xx'
res = re.sub('[a-zA-Z-]xx', '!', txt)
print(res)
Wynik wykonania kodu:
'! ! ! @xx'
Przykład
Można umieścić myślnik między dwiema grupami - tam na pewno nie utworzy jeszcze jednej grupy:
txt = 'axx 9xx -xx @xx'
res = re.sub('[a-z-0-9]xx', '!', txt)
print(res)
Wynik wykonania kodu:
'! ! ! @xx'
Zadania praktyczne
Dany jest ciąg:
txt = 'xaz xBz xcz x-z x@z'
Znajdź wszystkie ciągi według następującego wzorca:
litera 'x', duża lub mała
litera lub myślnik, litera 'z'.
Dany jest ciąg:
txt = 'xaz x$z x-z xcz x+z x%z x*z'
Znajdź wszystkie ciągi według następującego wzorca:
litera 'x', następnie lub dolar, lub
myślnik lub plus, potem litera 'z'.