Ekranowanie znaków specjalnych w wyrażeniach regularnych Pythona
Załóżmy, że trzeba sprawić, aby znak specjalny oznaczał sam siebie. W tym celu należy go wyekranować za pomocą ukośnika odwrotnego. Spójrzmy na przykładach.
Przykład
W następnym przykładzie autor wyrażenia regularnego chciał,
aby wzorzec wyszukiwania wyglądał tak: litera
'a', następnie plus '+', następnie
litera 'x'. Jednakże, autor kodu
nie wyekranował symbolu '+' i dlatego
wzorzec wyszukiwania w rzeczywistości wygląda tak:
litera 'a' jeden lub więcej razy,
potem litera 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Wynik wykonania kodu:
'a+x ! ! !'
Przykład
A teraz autor wyekranował plus ukośnikiem
odwrotnym. Teraz wzorzec wyszukiwania wygląda tak,
jak trzeba: litera 'a', następnie plus
'+', następnie litera 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Wynik wykonania kodu:
'! ax aax aaax'
Przykład
W tym przykładzie wzorzec wygląda tak:
litera 'a', następnie kropka '.',
następnie litera 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Wynik wykonania kodu:
'! abx azx'
Przykład
W następnym przykładzie autor zapomniał wyekranować ukośnik i pod wyrażenie regularne trafiły wszystkie podciągi, ponieważ niewyekranowana kropka oznacza dowolny znak:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Wynik wykonania kodu:
'! ! !'
Uwaga
Zwróć uwagę na to, że jeśli zapomnisz ukośnika odwrotnego dla kropki (kiedy powinna oznaczać samą siebie) - tego można nawet nie zauważyć:
res = re.sub('a.x', '!', 'a.x')
print(res) # zwróci '!', tak jak chcieliśmy
Wizualnie działa poprawnie (ponieważ kropka
oznacza dowolny znak, w tym również
zwykłą kropkę '.'). Ale jeśli zmienimy
ciąg, w którym odbywają się zamiany -
zobaczymy nasz błąd:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # zwróci '! ! !', a oczekiwano '! abx azx'
Lista znaków specjalnych i zwykłych
Jeśli wyekranujemy zwykły znak - nic strasznego się nie stanie - i tak będzie on oznaczał sam siebie. Wyjątek - cyfry, ich nie można ekranować.
Często pojawia się wątpliwość, czy dany symbol jest specjalny. Niektórzy dochodzą do tego, że ekranują wszystkie podejrzane znaki jeden po drugim. Jednakże, jest to zła praktyka (zanieczyszcza wyrażenie regularne ukośnikami odwrotnymi).
Są znakami specjalnymi: $ ^ . * + ? \ / {} [] () |
Nie są znakami specjalnymi: @ : , ' " - _ = < > % # ~ `& !
Zadania praktyczne
Dany jest ciąg:
txt = 'a.a aba aea'
Napisz wyrażenie regularne, które znajdzie ciąg
'a.a', nie chwytając pozostałych.
Dany jest ciąg:
txt = '2+3 223 2223'
Napisz wyrażenie regularne, które znajdzie ciąg
'2+3', nie chwytając pozostałych.
Dany jest ciąg:
txt = '23 2+3 2++3 2+++3 345 567'
Napisz wyrażenie regularne, które znajdzie ciągi
'2+3', '2++3', '2+++3',
nie chwytając pozostałych (+ może być dowolna
ilość).
Dany jest ciąg:
txt = '23 2+3 2++3 2+++3 445 677'
Napisz wyrażenie regularne, które znajdzie ciągi
'23', '2+3', '2++3',
'2+++3', nie chwytając pozostałych.
Dany jest ciąg:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Napisz wyrażenie regularne, które znajdzie ciągi
'*q+', '*qq+', '*qqq+',
nie chwytając pozostałych.
Dany jest ciąg:
txt = '[abc] {abc} abc (abc) [abc]'
Napisz wyrażenie regularne, które znajdzie ciągi
w nawiasach kwadratowych i zamieni je na
'!'.