Düzenli İfadeler - bayraklar

Bayraklar (Flags)

Buraya kadar öğrendiğimiz konularda, re modülünü kullanırken, eksiklik hissettiğiniz bazı durumlar ile karşılaşmış olabiliriz. Örneğin eşleşme yaparken küçük-büyük harf duyarlılığı ya da çok satırlı bir metin içindeki eşleşmeleri arama konuları bazen eksik sonuç elde etmenize sebep olmuş olabilir. Bu bölümde bahsedeceğim bayrak (flag) konusu, bu tür sorunların üstesinden gelmenize yardımcı olacaktır. İlk bayrak ile başlayalım.

re.IGNORECASE veya re.I

Bildiğiniz gibi, Python’da büyük-küçük harfler önemlidir. Yani eğer python kelimesini arıyorsanız, alacağınız çıktılar arasında Python olmayacaktır. Çünkü python ve Python birbirlerinden farklı iki karakter dizisidir.

Neden Kullanılır?

re.IGNORECASE özelliği, metin maddeleme, metin analizi veya kullanıcı girdileri gibi durumlarda, kullanıcıların büyük harf küçük harf karışımıyla yazdığı verilere karşı daha esnek olmak için kullanılır. Özellikle, arama işlemlerini sırasında harf büyüklüğünün önemli olmadığı durumlarda faydalıdır.

Bir kullanıcı tarafından sağlanan veriyle çalışırken veya çok dilli metinlerle uğraşırken re.IGNORECASE özelliği, arama işlemlerini daha geniş bir kapsama yaymak ve daha fazla esneklik sağlamak için kullanışlı bir araçtır.

re.IGNORECASE veya kısaca re.I adlı bayrak, bize büyük-küçük harfe dikkat etmeden (büyük harf ve küçük harf arasındaki farkı önemsemeden) arama / eşleme yapma imkanı sağlar. Hemen bir örnek verelim:

metin = """Programlama dili, programcının bir bilgisayara ne yapmasını
istediğini anlatmasının standartlaştırılmış bir yoludur. Programlama
dilleri, programcının bilgisayara hangi veri üzerinde işlem yapacağını,
verinin nasıl depolanıp iletileceğini, hangi koşullarda hangi işlemlerin
yapılacağını tam olarak anlatmasını sağlar. Şu ana kadar 2500’den fazla
programlama dili yapılmıştır. Bunlardan bazıları: Pascal, Basic, C, C#,
C++, Java, Cobol, Perl, Python, Ada, Fortran, Delphi programlama
dilleridir."""

# `re.compile()` ile kullanım
derli = re.compile("programlama", re.IGNORECASE)
print(derli.findall(metin))
['Programlama', 'Programlama', 'programlama', 'programlama']

Gördüğünüz gibi, metinde geçen hem programlama kelimesini hem de Programlama kelimesini ayıklayabildik. Bunu yapmamızı sağlayan şey de re.IGNORECASE adlı bayrak (flag) oldu.

Eğer bu seçeneği kullanmasaydık, çıktıda yalnızca programlama kelimesini görürdük. Çünkü aradığımız şey aslında programlama kelimesi idi. Biz istersek re.IGNORECASE yerine kısaca re.I ifadesini de kullanabiliriz. Aynı anlama gelecektir.

# Düzenli ifade içinde kullanım
result = re.match(r'python', 'Python is powerful!', re.IGNORECASE)
print(result.group())
Python

Bayraklar, Flags etiketi ile de kullanılabilir;

derli = re.compile("programlama", flags=re.IGNORECASE)
print(derli.findall(metin))

re.MULTILINE veya re.M

re.MULTILINE bayrağı (flag), bir düzenli ifadenin çok satırlı bir metin içindeki eşleşmeleri nasıl ele aldığını kontrol etmek için kullanılır. Bu bayrak, bir metin içindeki her bir satırı ayrı ayrı ele alarak düzenli ifadenin davranışını etkiler. Özellikle, ^ (başlangıç) ve $ (bitiş) meta karakterlerinin metnin başı ve sonu yerine her satırın başı ve sonuyla eşleşmesini sağlar.

Neden Kullanılır?

re.MULTILINE özelliği, çok satırlı metinlerle çalışırken ve her bir satırın başı veya sonu ile eşleşme yapmak istediğinizde kullanılır. Özellikle, metni satırlara bölüp her bir satıra ayrı ayrı düzenli ifadeler uygulamak istediğiniz durumlar için uygundur.

Bu özellik, metin maddeleme, metin analizi veya log dosyaları gibi çok satırlı metinlerle çalışırken kullanışlıdır. re.MULTILINE sayesinde, düzenli ifadelerle satırları tek tek ele alabilir ve her bir satır için eşleşmeleri bulabilirsiniz.

Kullanımı

re.MULTILINE bayrağı, re.compile() fonksiyonu ile birlikte veya bir düzenli ifade string'i içinde kullanılabilir. İşte kullanım örnekleri:

import re

# `re.compile()` ile kullanım
pattern = re.compile(r'^\w+', re.MULTILINE)
text = """Python
is
awesome"""

result = pattern.findall(text)
print(result)
# ['Python', 'is', 'awesome']
text = """Python
is
awesome"""

# Düzenli ifade içinde kullanım
result = re.findall(r'^\w+', text, re.MULTILINE)
print(result)
['Python', 'is', 'awesome']

Bu örneklerde, re.MULTILINE bayrağı kullanılarak ^\w+ düzenli ifadesi her satırın başındaki kelimeyi eşleştirmektedir.

re.DOTALL veya re.S

Bildiğiniz gibi, metakarakterler arasında yer alan . sembolü herhangi bir karakterin yerini tutuyordu. Bu metakarakter bütün karakterlerin yerini tutmak üzere kullanılabilir. Hatırlarsanız, . metakarakterini anlatırken, bu metakarakterin, yeni satır karakterinin yerini tutmayacağını söylemiştik. re.DOTALL veya re.S bayrağı, bir düzenli ifadenin . karakterinin metin içinde yeni satır karakterleriyle de eşleşmesini sağlar. Bunu bir örnek yardımıyla görelim. Diyelim ki elimizde şöyle bir karakter dizisi var:

a = """Ben Python,
Monty Python"""
print(a)
Ben Python,
Monty Python

Bu karakter dizisi içinde Python kelimesini temel alarak bir arama yapmak istiyorsak eğer, kullanacağımız şu kod istediğimiz şeyi yeterince yerine getiremeyecektir:

derle = re.compile("Python.*")
nesne = derle.search(a)

if nesne:
    print(nesne.group())
Python,

Bunun sebebi, . metakarakterinin \n (yeni satır) kaçış dizisini dikkate almamasıdır. Bu yüzden bu kaçış dizisinin ötesine geçip orada arama yapmıyor. Ama şimdi biz ona bu yeteneği de kazandıracağız:

# `re.compile()` ile kullanım
derle = re.compile("Python.*", re.DOTALL)
nesne = derle.search(a)

if nesne:
    print(nesne.group())
Python,
Monty Python

re.DOTALL seçeneğini re.S şeklinde de kısaltabilirsiniz / kullanabilirsiniz.

import re

text = """This is a multiline
text with new lines.
"""

# Düzenli ifade içinde kullanım
result = re.match(r'.+', text, re.S)
print(result.group())  
This is a multiline
text with new lines.

re.UNICODE veya re.U

re.UNICODE, bayrağı (flag), bir düzenli ifadenin Unicode karakter setini kullanmasını sağlar. Varsayılan durumda, bazı düzenli ifade karakter sınıfları, yalnızca ASCII karakter setini anlar. Ancak, re.UNICODE özelliği ile Unicode karakterler de dikkate alınır. Özellikle, çok dilli uygulamalarda veya farklı dil ve alfabeleri içeren metinlerle uğraşırken kullanışlıdır. Bu özellik sayesinde, Unicode karakterler, düzenli ifadelerde doğru şekilde ele alınır ve beklenen eşleşmeleri sağlar.

Kullanımı

re.UNICODE bayrağı, re.compile() fonksiyonu ile birlikte veya bir düzenli ifade string'i içinde kullanılabilir. İşte kullanım örnekleri:

import re

# `re.compile()` ile kullanım
pattern = re.compile(r'\w+', re.U)
text = "Yüksek Yapılı Dağlar Çok Haşmetlidir"

result = pattern.findall(text)
print(result)    

# ÇIKTI: ['Yüksek', 'Yapılı', 'Dağlar', 'Çok', 'Haşmetlidir']

# Düzenli ifade içinde kullanım
result = re.findall(r'\w+', text, re.UNICODE)
print(result)  

# ÇIKTI : ['Yüksek', 'Yapılı', 'Dağlar', 'Çok', 'Haşmetlidir']

Bu örnekte, re.UNICODE bayrağı kullanılarak \w+ düzenli ifadesi Unicode karakterlerle kelime karakterlerini eşleştirmektedir.