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:

pythontxt = '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:

pythontxt = '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:

pythontxt = '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:

pythontxt = '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:

pythontxt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)

print(res) # 'b!' yazdırır

Pratik Problemler

Задание 1

Fonksiyon isimlerini içeren bir dize verilmiştir:

pythontxt = 'func1() func2() func3()'

Dizeden fonksiyon isimlerinin bir dizisini elde edin.

Задание 2

Bir etiket içeren bir dize verilmiştir:

pythontxt = '<a href="" class="eee" id="zzz">'

Bu etiketin öznitelik isimlerinin bir dizisini elde edin.

Задание 3

Değişkenler içeren bir dize verilmiştir:

pythontxt = '$aaa $bbb $ccc xxxx'

Önünde dolar işareti bulunan alt dizileri elde edin.