Gelişmiş Python Geliştirme Kursu
Bölüm
>
Seviye
Dize ve Zaman Modülleri
Regex Modülü
Amaç
Düzenli ifadeler kullanarak çalışanlarla ve bölge tahsisatlarıyla ilgili dosyaları doğrulayın ve düzenleyin.
Yan ofislerde, yeni tarım arazisinde çalışmaya başlayan çalışanlar ve mahsuller ile hayvanların bakılacağı bölgelerin planlaması hakkında güncellenmesi gereken bazı belgeler bulunmaktadır. Dosyaları yönetmek oldukça karmaşık olabilir, özellikle de büyük metin bloklarıyla uğraşırken. Bu amaçla, Genellikle Regex olarak da kısaltılan Düzenli İfadelerin kısaltması olan re modülünü kullanacağız. import re şeklinde erişebileceğimiz modülün, bu seviyede aşağıdaki fonksiyonlarını kullanacağız:
re.findall(): Bir dizedeki tüm eşleşmeleri içeren bir liste döndürür. İki (2) argüman alır; ilki aradığınız karakterler, ikincisi ise aramanın yapılacağı dizedir.re.sub(): Belirtilen eşleşmeyi belirli bir dize ile değiştirir. Üç (3) argüman alır; ilki değiştirmek istediğiniz karakterler, ikincisi yerine geçecek dize ve üçüncüsü aramanın yapılacağı dizedir.re.search(): Bir dizede bir şeyin konumunu bulur, bir nesne döndürür. İki (2) argüman alır; aradığınız karakterler ve arama yapılan dize. Döndürülen nesne ilespan()gibi diğer fonksiyonları kullanabilirsiniz; bu, aranan öğenin metindeki başlangıç ve bitiş konumlarını içeren bir vektör döndürür.re.split(): Belirtilen aralıklarla dizeyi bir listeye böler. İki (2) argüman alır; ilki dizeyi bölecek karakterler ve ikincisi bölünecek dizedir.re.match(): Bir dize belirli bir değeri içeriyor mu diye kontrol eder; bu, basitleştirilmiş birre.search()versiyonu gibidir ancak daha verimli çalışır ve aranan dizede sorgunun başta olup olmadığını kontrol eder.
re modülü özel diziler de kullanabilir; düzenli ifadelerle çalışırken dizge özelliklerinin çeşitliliğini kapsayan kodları kullanmanıza olanak tanır. Çok uzun bir özel dizi listesi bulunmasına rağmen, bu seviyede aşağıdakileri kullanacağız:
\B: Belirtilen karakterlerin dizge içerisinde olup olmadığını, fakat kelimenin başında veya sonunda bulunmadığını kontrol eder.\D: Karakterlerin 0-9 rakamı olmadığını döndürür.
Özel bir dizide r bulunması, ham dize kontrolü yapıldığı anlamına gelir.
Başlamak için, altın X işaretine gidin ve notun bulunduğu masaya doğru bakın, read() fonksiyonunu kullanarak tüm çalışanların listesini içeren notu kontrol edin. Her isim, çalışan numaralarını belirten # içerir; isimleri içeren dize aynı zamanda manifest adlı bir sabitte de saklanmaktadır.
Bir tags adında liste oluşturun ve re.findall() fonksiyonunu kullanarak manifest sabitindeki tüm # karakterlerini arayın, örneğin: tags = re.findall("#", manifest) . Bir number değişkeni oluşturun ve listedeki öğe sayısını hesaplamak için len() fonksiyonunu tags listesiyle kullanın; bu, manifestte kaç çalışan olduğunu anlamamıza olanak tanıyacaktır. speak() fonksiyonunu, listedeki kaç isim olduğunu duyurmak için number değişkeni ile kullanın.
Sonraki adımda, mavi halının yanındaki hafif X işaretine gidin, masanın karşısına geçin ve read() fonksiyonunu kullanın. Burada, atanmış pozisyonları ile birlikte yeni işe alınanların listesini bulacaksınız. Şu anda atanmış kişilerle çapraz kontrol yapabilmek için her meslekteki isimleri not edin. Mavi halı üzerinde bulunan X işaretine gidin ve atanmış işleri doğrulamak için read() fonksiyonunu tekrar kullanın.
Mevcut iş gücü, assignments adlı sabitte saklanmaktadır; bu belgeyi yeni işe alınanlar listesindeki bilgilerle güncellememiz gerekmektedir. Listedeki farklı isimleri re.sub() fonksiyonunu kullanarak dizedeki bir kısmı diğer bir kısım ile değiştirecek şekilde güncelleyin. Örneğin aşağıdaki düzenleme yapılmıştır:
assignments = re.sub("Billy Hodgins", "Carol Hopkins", assignments)
Belgedeki "Billy Hodgins" ismi "Carol Hopkins" ile değiştirilmiştir. Bu değişikliğin yanı sıra belgeyi tarayın ve listenizdeki diğer bir ismi de güncelleyerek belgeyi tamamen güncelleyin. Sonuçları kontrol etmek için assignments ile write() fonksiyonunu kullanın.
Artık çalışan listelerini hallettiğimize göre, çiftlik için bölge düzenlemelerine geçme zamanı. Kırmızı halının üzerindeki koyu X işaretine gidin ve read() fonksiyonunu kullanın, bu size bölge düzenlemelerinin detaylı bir incelemesini gösterecektir. Bu bilgiler zones adlı bir sabitte saklanmaktadır.
Özellikle, belgedeki 6210 konumunu belirlemek önemlidir çünkü bu bölgenin yeniden değerlendirilmesi gerekmektedir. Bunu yapmak için, re.search() fonksiyonunu kullanarak bölge numarasının konumunu belirleyin. index adında bir değişken oluşturun ve arama nesnesini saklayın; aramayı r"6210\B" olarak ayarlayın. Bu şu anlama gelmektedir: r ham dize araması yapar, 6210 aranan bölge numarasıdır ve \B arama için özel dizi kriteridir. Bu, şu şekilde yapılır: index = re.search(r"6210\B", zones) .
Artık index bir arama nesnesi tuttuğuna göre, span() fonksiyonunu kullanarak ondan veri çıkartmanın zamanı gelmiştir. vector adında bir değişken oluşturun ve arama nesnesinin konumunu şu şekilde saklayın: vector = index.span() . Kurulum tamamlandıktan sonra, önceden yazılmış write() fonksiyonu ile vector değişkenini kullanın.
Sonraki adımda bölge düzenleme öğelerini tanımlamaya çalışacağız; yeşil halı üzerindeki koyu X işaretine gidin. sectors adında bir liste oluşturun ve re.split() fonksiyonunu kullanarak çeşitli bölge sektörlerini bir listeye toplayın. split() fonksiyonunda, zones değişkeninden sadece sayıları almak için "\D" özel dizisini kullanın. Listenin içindeki boşlukları kaldırmak için len() fonksiyonu kullanarak, gereksiz küçük öğeleri kaldıran liste kavramasını kullanın. Örneğin:
sectors = re.split("\D", zones) sectors = [x for x in sectors if len(x) > 3]
Tüm bölge sektörlerini yazıya dökmek için zones ile birlikte write() fonksiyonunu kullanın.
Mor halının yanındaki hafif X işaretine gidin, dosya dolabının karşısına geçin ve tarım arazisi bölge düzenlemelerindeki öncelikli sektörleri doğrulamak için read() fonksiyonunu kullanın. Bu sektörleri not alın çünkü bu sektörlerin bölge listesinin içinde yer alıp almadığını kontrol etmemiz gerekmektedir.
Mor halı üzerindeki koyu X işaretine gidin; burada, sector_a, sector_b ve sector_c adlı değişkenlerde üç (3) öncelikli sektör bulunmaktadır, bunlar kod editöründe önceden yazılmıştır; ışıklı X işaretinde okuduklarınızı bu değerlere ekleyin. Bu değişkenler, sectors listesindeki tüm öğelerden geçip re.match() fonksiyonu ile filtreleme yapan bir liste kavraması kullanır. Seviyeyi tamamlamak için sector_a, sector_b ve sector_c değişkenlerini önceden yazılmış write() fonksiyonu içerisine yerleştirin.