Python'da Düzenli İfadelerde Özel Karakterlerin Kaçışı
Bir özel karakterin kendisini temsil etmesini sağlamamız gerektiğini varsayalım. Bunun için karakteri ters eğik çizgi ile kaçışlamalıyız. Örneklerle inceleyelim.
Örnek
Aşağıdaki örnekte, regex yazarı arama kalıbının harf
'a', ardından artı '+', ardından
harf 'x' şeklinde olmasını istedi. Ancak, kod yazarı
'+' karakterini kaçışlamadığı için arama kalıbı aslında
şu şekildedir: harf 'a' bir veya daha fazla kez,
sonra harf 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Kodun çalıştırılmasının sonucu:
'a+x ! ! !'
Örnek
Şimdi yazar artı işaretini ters eğik çizgi ile kaçışlattı. Artık arama kalıbı
olması gerektiği gibi görünüyor: harf 'a', ardından artı
'+', ardından harf 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Kodun çalıştırılmasının sonucu:
'! ax aax aaax'
Örnek
Bu örnekte, kalıp şu şekildedir:
harf 'a', ardından nokta '.',
ardından harf 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Kodun çalıştırılmasının sonucu:
'! abx azx'
Örnek
Aşağıdaki örnekte yazar eğik çizgiyi kaçışlamayı unuttu ve regex tüm alt dizileri yakaladı, çünkü kaçışlanmamış nokta herhangi bir karakteri temsil eder:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Kodun çalıştırılmasının sonucu:
'! ! !'
Not
Eğer bir nokta için ters eğik çizgiyi unutursanız (ne zaman kendisini temsil etmesi gerekiyorsa) - bunu fark etmeyebilirsiniz bile:
res = re.sub('a.x', '!', 'a.x')
print(res) # beklediğimiz gibi '!' döndürür
Görsel olarak doğru çalışıyor (çünkü nokta
herhangi bir karakteri temsil eder, aynı zamanda
normal bir noktayı da '.'). Ancak eğer
değiştirmelerin yapıldığı dizgiyi değiştirirsek -
hatamızı göreceğiz:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # '! ! !' döndürür, beklenen '! abx azx' idi
Özel karakterlerin ve normal karakterlerin listesi
Eğer normal bir karakteri kaçışlarsanız - hiçbir sorun olmaz - yine kendisini temsil edecektir. İstisna - rakamlar, onlar kaçışlanamaz.
Sık sık, belirli bir karakterin özel olup olmadığı konusunda şüphe doğar. Bazıları şüpheli tüm karakterleri sırayla kaçışlama noktasına kadar varır. Ancak, bu kötü bir alışkanlıktır (regex'i ters eğik çizgilerle kirletir).
Özel karakterlerdir: $ ^ . * + ? \ / {} [] () |
Özel karakter değildir: @ : , ' " - _ = < > % # ~ `& !
Pratik görevler
Bir dizgi verildi:
txt = 'a.a aba aea'
'a.a' dizgisini bulan, diğerlerini yakalamayan
bir düzenli ifade yazın.
Bir dizgi verildi:
txt = '2+3 223 2223'
'2+3' dizgisini bulan, diğerlerini yakalamayan
bir düzenli ifade yazın.
Bir dizgi verildi:
txt = '23 2+3 2++3 2+++3 345 567'
'2+3', '2++3', '2+++3'
dizgilerini bulan, diğerlerini yakalamayan
bir düzenli ifade yazın (+ herhangi bir sayıda olabilir).
Bir dizgi verildi:
txt = '23 2+3 2++3 2+++3 445 677'
'23', '2+3', '2++3',
'2+++3' dizgilerini bulan, diğerlerini yakalamayan
bir düzenli ifade yazın.
Bir dizgi verildi:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
'*q+', '*qq+', '*qqq+'
dizgilerini bulan, diğerlerini yakalamayan
bir düzenli ifade yazın.
Bir dizgi verildi:
txt = '[abc] {abc} abc (abc) [abc]'
Köşeli parantezler içindeki dizgileri bulup
onları '!' ile değiştiren
bir düzenli ifade yazın.