Varsın Bir RegEx Kalsın !

Şule Akçay
3 min readOct 6, 2023

--

yapayogrenmemuhendisi

Herkese selamlar , nasıl bir başlık bu dediğini duyar gibiyim. 😉

İçimden geldi. Direkt Pythonda RegEx başlığı ile girmek istemedim. Ama sana şunu söylemeliyimki çok değerli bilgiler öğreneceğiz. İlk bakışta RegEx nedir ? pistine giriş yapıp, burada örneklerle uçmaya başlayacağız.

RegEx Nedir ❓

RegEx (Regular Expression), bir metin işleme aracıdır. Patern’lar oluşturarak, belirlenmiş bir metinde ihtiyaca uygun aramalar yaparak, metni değiştirmek veya metni istenilen kurallarla bölümlere ayırabilirsiniz.

Biz örneklerimizde python dilinin desteğini alacağız. Ama size şunu söylemeliyimki birçok dilde (C, C++, java, …) regEx ile denk gelip kullanabilirsiniz.

RegEx, bir metindeki patern’ları tanımlamak için özel semboller ve belirteçler kullanır. Bu kullanılan semboller, bir metindeki farklı karakterleri, rakamları, boşlukları, noktalama işaretlerini temsil eder.

Aklımızda daha iyi oturması için örnek verecek olursak, bir metindeki tüm e-posta adreslerini bulmak için regEx kullanabilirsiniz. (ETL işlemlerinde kullanılma oranı yüksektir. @ işareti içermeyen email kolonunda satır varsa gel bu kolona NULL bas gibi.)

Şimdi sıra ile örneklerimizin üstünden ilerleyelim. Örneklerimizin zorluk derecesini adım adım artıracağız.

📍HATIRLATMA : Python’da regex kullanımı, re modülü aracılığıyla gerçekleştirilir.

METİN ARAMA


import re

txt = "Python, nesne yönelimli, yorumlamalı, birimsel ve etkileşimli yüksek seviyeli bir programlama dilidir."

match = re.search('seviyeli', txt)


if match:
print("Kelime :",match.group())
print("Başlangıç :", match.start())

Yukarıdaki kod örneği , seviyeli kelimesini bulur. Eğer kelime varsa kelime ve başlangıç index değerini ekrana basar.

Output :

Kelime : seviyeli

Başlangıç : 69

İSTENİLEN KARAKTERLERİN ARANMASI



import re

txt = "Python, nesne yönelimli, yorumlamalı, birimsel ve etkileşimli yüksek seviyeli bir programlama dilidir."

match = re.search('sev.', txt)


if match:
print(match.group())

Yukarıdaki örnek, seviyeli kelimesinin sonunda herhangi bir karakterin bulunup bulunmadığını kontrol eder ve eşleşme bulunursa ekrana yazdırır.

Output: sevi

ÖZEL KARAKTERLERİN BULUNMASI


import re

txt = "Python, nesne yönelimli, yorumlamalı, birimsel ve etkileşimli yüksek seviyeli bir programlama dilidir."


match = re.search('\W', txt)

# Eğer özel karakter bulunursa ekrana yazdıralım
if match:
print(match.group())

Yukarıdaki örnek, metinde özel bir karakterin(noktalama işareti v.b) bulunup bulunmadığını kontrol eder eşleşme varsa ekrana yazdırır.

Output : ,

İŞARETLE

import re

txt = "Python, nesne yönelimli, yorumlamalı, birimsel ve etkileşimli yüksek seviyeli bir programlama dilidir."

# 'seviyeli' kelimesi koyu yazılır
new_formatted = re.sub('seviyeli', '<b>seviyeli</b>', txt)


print(new_formatted)

Yukarıdaki örnekte re.sub kullanarak bir HTML etiketi ekleyerek desen değiştirebiliriz.

ÇOK SATIRLI METİNLER İÇİ PATTERN

# Çok Satırlı Metinler İçin Desenler

import re

txt = """
Python, nesne yönelimli, yorumlamalı.
Bilimsel.
Etkileşimli.
Yüksek seviyeli bir programlama dilidir."""

# Çok satırlı metinler için desen aranabilir
pattern = re.compile("seviyeli", re.MULTILINE)

# Eşleşme aranıyor
matches = pattern.findall(txt)

for match in matches:
print(match)

re.MULTILINE kullanarak çok satırlı metinler için pattern aranır.

NOKTALAMA İŞARETLERİNE GÖRE AYIRMA

import re

txt = "Python, nesne yönelimli, yorumlamalı, birimsel ve etkileşimli yüksek seviyeli bir programlama dilidir."

# Metni noktalama işaretlerine göre ayırır
result = re.split(r'[.,;!?]\s*', txt)


print(result)

Yukarıdaki örnekte, txt adındaki metni noktalama işaretlerine göre ayırır. Bunun için re.split metotunu kullandık.

✔️Sıklıkla Kullandığımız bize verilen e-posta adresinin geçerli olup olmadığını doğrulamak için bir örnek yapalım.


import re

def check_email(email):
"""_summary_
Verilen e-posta adresinin geçerli olup olmadığını kontrol eder.

Args:
email (_type_): _description_
"""

# E-posta adresi doğrulama için kullanılan regex deseni
pattern = r'^\w+([.-]?\w+)*@\w+([.-]?\w+)*(\.\w{2,3})+$'

#email uyumlu mu
if re.match(pattern, email):
return True
else:
return False

# Test için birkaç örnek e-posta adresi
emails = ['yapayogrenme@example.com', 'yapayogrenme-1@example.com', 'yapayogrenme.1@example.com', 'yapayogrenme_1@example.com','yapayogrenme@example.co.uk', 'yapayogrenme@example.com.tr', 'yapayogrenme@example.technology', 'yapayogrenme@example.ist']




for email in emails:
if check_email(email):
print(f"{email} geçerli bir e-posta adresidir.")
else:
print(f"{email} geçerli bir e-posta adresi değildir.")

Output :

yapayogrenme@example.com geçerli bir e-posta adresidir.

yapayogrenme-1@example.com geçerli bir e-posta adresidir. yapayogrenme.1@example.com geçerli bir e-posta adresidir. yapayogrenme_1@example.com geçerli bir e-posta adresidir. yapayogrenme@example.co.uk geçerli bir e-posta adresidir. yapayogrenme@example.com.tr geçerli bir e-posta adresidir. yapayogrenme@example.technology geçerli bir e-posta adresi değildir. yapayogrenme@example.ist geçerli bir e-posta adresidir.

Temel seviyede RegEx öğrenmiş olduğumuza inanıyorum. Bir sonraki keyifle yazdığımız yazımızda görüşmek üzere.

Kendinize iyi bakın.😉

Kaynakça

https://tr.wikipedia.org/wiki/Python

https://docs.python.org/3/library/re.html

--

--