Python'da Düzenli İfadelerde Pozitif ve Negatif İnceleme
Bazen şu tür bir problemi çözmek gerekir:
'aaa' dizesini bul ve '!' ile değiştir,
ancak sadece 'aaa' dan sonra
'x' geliyorsa, ve 'x''in
kendisi değiştirilmesin. Eğer bu problemi
'doğrudan' çözmeye çalışırsak,
başarılı olamayız:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # '! baaa' yazdırır, oysa '!x baaa' istiyorduk
İleri İnceleme
Problemi çözmek için, 'x''in
değiştirilmemesi gerektiğini söylemenin bir yoluna
ihtiyaç var. Bu, (?= ) özel parantezleri
kullanılarak yapılır, bunlar sadece bakar ama
kendileriyle birlikte almazlar.
Bu parantezlere pozitif ileri inceleme
denir. Pozitif - çünkü 'x'
(bizim durumumuzda) olmalıdır - ancak o zaman
değişiklik gerçekleşir.
Şimdi bu parantezleri problemimizi çözmek için kullanalım:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # '!x aaab yazdırır
Ayrıca negatif ileri inceleme
vardır - (?! ) - bu, tam tersine,
bir şeyin olmaması gerektiğini söyler. Bir sonraki
örnekte, değişiklik sadece 'aaa' dan sonra
'x' OLMADIĞI zaman gerçekleşir:
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # 'aaax !b' yazdırır
Geri İnceleme
Benzer şekilde pozitif geri inceleme
vardır - (?<= ). Bir sonraki
örnekte, değişiklik sadece 'aaa' dan önce
'x' olduğunda gerçekleşir:
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # 'x!' yazdırır
Ayrıca negatif geri inceleme
vardır - (?<! ). Bir sonraki örnekte
değişiklik sadece 'aaa' dan önce
'x' OLMADIĞI zaman gerçekleşir:
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # 'b!' yazdırır
Pratik Problemler
Fonksiyon isimlerini içeren bir dize verilmiştir:
txt = 'func1() func2() func3()'
Dizeden fonksiyon isimlerinin bir dizisini elde edin.
Bir etiket içeren bir dize verilmiştir:
txt = '<a href="" class="eee" id="zzz">'
Bu etiketin öznitelik isimlerinin bir dizisini elde edin.
Değişkenler içeren bir dize verilmiştir:
txt = '$aaa $bbb $ccc xxxx'
Önünde dolar işareti bulunan alt dizileri elde edin.