Python normal ifade

Python işlevleri ve meth

Yeni bir geliştirici olarak, normal ifadeler (veya yaygın olarak bilinen adıyla normal ifade), garip ve alışılmadık sözdizimi nedeniyle göz korkutucu olabilir:    

Yeni bir geliştiriciyken ve yukarıdaki ifadeyi ilk kez gördüğümde, ilk düşüncemin “neyi söyle? O zırvalığı asla öğrenemeyeceğim. Bu benim için çok fazla. Ben yapamam.

Ama yapabilirsin! Bu sadece, normal ifadelerin çok yabancı olduğuna dair o ilk baştaki ezici duyguyu yenme meselesidir. Tıpkı bir yabancı dili öğrenmek veya konuşmak gibi — Bir kez asarsanız, oldukça doğal gelecektir. Söz veriyorum!

Bu yazıda düzenli ifadelerin ne olduğuna, neden kullanıldığına ve Python'da nasıl kullanılacağına bir göz atacağız. Bu makaleyi tamamladığınızda, normal ifadeler hakkında sağlam bir anlayışa sahip olacaksınız, böylece yukarıdaki ifadenin ne anlama geldiğini yorumlayabilirsiniz!




Normal İfadeler Nedir? 

Ne zaman düzenli ifadenin ne olduğuna bakarsak, kendimize string'in ne olduğunu hatırlatmamız gerekir. Bir dizenin yalnızca birbirine dizilmiş ve bir dizi tırnak işaretiyle sınırlanmış bir karakter koleksiyonu olduğunu unutmayın:

 &ldquo ;Merhaba Dünya” “555-555-5555”    “John Doe 123 Main St. Anywhere, ABD 99999-9999”   “[email protected]

Bunların tümü dize örnekleridir. Herhangi bir uzunlukta olabilirler veya hiç uzunlukta olabilirler. Normal İfadeler veya daha yaygın olarak regex olarak kısaltılır, bileşenleri bir tür bilgiyi bulmak için kalıpları dizelerle eşleştiren bir ifadedir.

Katılımcıların %81'i belirtti. bir eğitim kampına katıldıktan sonra teknik iş beklentileri konusunda daha emin hissettiler. Bugün bir eğitim kampı ile eşleştirin.

Ortalama bir eğitim kampı mezunu, bir eğitim kampına başlamaktan ilk işini bulmaya kadar, kariyer geçişinde altı aydan daha az zaman harcadı.

Normal ifadenin harika yanları — oldukça dilden bağımsızdır. Fark, dilin yöntemlerinde ve bu ifadeleri kullanarak eylemlerin nasıl gerçekleştirileceğinde ortaya çıkar. 

Normal İfadeler Ne İçin Kullanılır?

Düzenli ifade, bizim yapmak istediğimiz bir kalıptır. özellikle bir dizgede arayın. Belirli bir ifadeyi veya kalıbı başka bir şeyle değiştirmek üzere aramak için normal ifadeyi kullanabilir veya bir kullanıcının tüm kullanıcılar arasında tutarlı olması için belirli bir biçimde bilgi girdiğinden emin olmak için formları doğrulayabiliriz.

Ara ve Değiştir

Örneğin, şu biçimde sunulan bir telefon numaramız olduğunu varsayalım:

 555 555 5555 

Bu, Amerika Birleşik Devletleri'ndeki bir telefon numarası için geçerli bir biçimdir. Peki ya boşlukları tire ile değiştirmek istersek? Veya alan kodunun etrafına parantez ve daha okunabilir hale getirmek için kısa çizgi mi ekleyin?

Bunun için normal ifadeler kullanabiliriz! Bunu Python ile nasıl yapacağınızı bir sonraki bölümde ele alacağız — şimdilik, normal ifadelerle neler yapabileceğiniz ve bunların nasıl yararlı olabileceği konusunda genel bir fikir edinmenizi istiyorum.

Kullanmak istediğimiz biçim için Python şöyle olurdu:

Düzenli ifadelerde sabit kodlamaya veya dizenin belirli bir değerini veya dizinini aramaya gerek yoktur, çünkü sadece dizilerdeki kalıpları arayabilir ve eşleştirmemiz gereken tüm kayıtları değiştirebiliriz.

Doğrula

Bir sitede yalnızca görüntülenmesi için bir şey doldurdunuz mu? Kaçırılan bir sembol veya takip etmediğiniz bir kalıp nedeniyle bir hata mesajı mı? Girişinizin, veritabanlarının aradığıyla eşleştiğinden emin olmak için büyük olasılıkla normal ifadeler kullanıldı.

Buna doğrulama denir ve bir telefon numarasının aradığından emin olmak için formlar oluştururken çok kullanışlıdır. olmasını istediğiniz biçimde veya bir e-posta adresinin uygun şekilde biçimlendirilmiş bir e-posta adresi olması veya bir parolanın, geçerli bir parola olması için belirlediğiniz parametrelerle (uzunluk, özel karakterler, rakamlar, büyük veya küçük harf) eşleşmesi , vb.). 

Bu, kullanıcıyı yazım hataları veya eşleşmeyen kalıplar konusunda uyararak veritabanınızdaki hataları önlemeye yardımcı olur. 

Bir sonraki bölümde, düzenli ifadeler oluşturan bileşenlere veya kalıp eşleştiricilere bir göz atacağız.




Normal İfade Model Eşleştirici Türleri

Sabit karakterler, meta karakterler ve niceleyiciler, normal ifadede gördüğümüz kalıp eşleştirici türlerini artırın. Bir kalıp eşleştirici, bir dizgede bir kalıp bulmaya yardımcı olmak için kullanılan bir karakterdir. Bu, bir normal ifadenin birincil yapı taşıdır.

Sabit Karakterler

Normal ifadede bir kalıp eşleştiricinin en temel örneği, değişmez bir karakterdir. Sabit kodlanmış bir karakter veya dizeyle eşleşir.

Örnekler: 

merhaba ⇒ beş farklı karakterden oluşan koleksiyon.

Burada bir normal ifade kalıbı uygulandığında, bu karakterlerin her birini sırayla arar. "merhaba", "merhaba" veya "merhaba"; bir model kontrolünden geçecektir, ancak “Merhaba”, “helo” veya “HeLlo” olmazdı.

"Python.Engineering hayatıma en çok ihtiyacım olduğu anda girdi ve hızlı bir şekilde bir eğitim kampıyla eşleşmeme yardımcı oldu. Mezun olduktan iki ay sonra, değerlerim ve hedeflerim ile uyumlu hayalimdeki işi buldum in life!"

Venus, Rockbot'ta Yazılım Mühendisi

A ⇒ tek bir farklı karakter koleksiyonu.

Normal ifade farklı karakterler aradığı için büyük/küçük harfe duyarlıdır. Yani “A” geçerdi, ancak “a” olmaz. Buna birazdan daha fazla gireceğiz. 

Basit bir cümle. ⇒ birkaç farklı karakterden oluşan koleksiyon.

Regex, bir dizeye baktığında ifadedeki her karakteri sırayla arar. “Basit bir cümle” tam olarak normal ifadede yazıldığı gibi aranan dizgede değilse, geçemez.

Karakterlerden Kaçış

Son örneğe bir göz atın. Dikkat edin, dönemin önünde bir nokta var. Normal ifade söz dizimindeki bir nokta, JavaScript veya Python gibi dillerdeki anahtar kelimelerle eş anlamlıdır.

Bir kalıbın parçası olmasını istiyorsanız, noktayı/noktayı tek başına kullanamazsınız. düzenli ifadeler. Normal ifade motorunun bunu regex anlamı yerine bir noktanın gerçek temsili olarak yorumlaması için karakterden kaçmanız gerekir. 

İşte, diğer bazı özel karakter dizileri: normal ifade motorunun onu derlediği çevrilmiş anlam yerine değişmez karakteri istiyorsanız, kaçmanız gerekir.

  • Yıldız *
  • Ters eğik çizgi /
  • Artı +
  • Caret ^
  • Dolar İşareti $
  • Nokta/Nokta .
  • Boru |
  • Soru İşaretle ?
  • Parantezler – her iki tür ()
  • Kıvrımlı Ayraçlar – her iki tür {}

Normal ifadedeki değişmez karakterler, kalıbın parçası olarak eklediğiniz karakterle tam olarak eşleşir. Yukarıda listelenen bir karakteri dahil etmek istiyorsanız, normal ifadenizin bir parçası olabilmesi için ondan kaçındığınızdan emin olun.

Genel Eşleştiriciler

Bir eşleştirici, bir desendeki birden çok harfi eşleştirmektir. Bu kalıp eşleştirme sembolleri koleksiyonu, normal ifade kullanan programlama dilleri arasında oldukça tutarlıdır.

EşleştiriciAçıklamaÖrnek
.Her karakterle eşleşirnw şimdi, yeni veya yeni vb. ile eşleşir. Herhangi bir karakter testi geçer
^regexŞurada kalıp arar satırın başlangıcı^hello, o kalıpla başlayan bir satırda merhaba ile eşleşir
regex$Desen arar satırın sonundaworld$ bu kalıpla biten bir satırda dünya ile eşleşir
[abc]Eşleşmeler a, b veya c [misp]bir küme olarak kabul edilir ve içinde bu karakterlerden herhangi birini içeren herhangi bir dizeyle eşleşir. 
Örneğin, mississippi'deki tüm harflerle eşleşebilir ve miss, ancak marsh ve missouri'deki harflerin yalnızca bir kısmı
[abc][xyz]Maç hes a, b veya c, ardından x, y veya z/[Mm][sip]/, M veya m ile başlayan herhangi bir dizeyle, ardından aşağıdakilerden herhangi birine sahip bir kümeyle eşleşir. [sip]
[^abc]a, b veya c değil[^rstlne] içindeki karakterler eşleşir r, s, t, l, n veya e olmayan herhangi bir karakter
[a-zA-Z0-9]Herhangi bir karakterle eşleşir [an] aralığında, a ve n arasındaki herhangi bir karakterle eşleşir. ve, end, kör, can, hepsinde burada tamamen eşleşen karakterler bulunur
A|BA veya B< /td>A|m. M veya m ile en az bir veya daha fazla başka karakterle eşleşen en az iki karakter uzunluğundaki herhangi bir kelime veya kelime öbeğiyle eşleşir.
CATC, ardından A ve ardından T ile eşleşenlermerhaba dünya merhaba dünya ile tam olarak eşleşir

Meta karakterler

Normal ifadeler ayrıca bir kalıbı tanımlamak için meta karakterler kullanır. Metakarakterlerin arkalarında bir tür anlamı vardır ve kalıbın şeklini tanımlarlar.

Meta karakterAçıklamaÖrnek
dHerhangi bir rakamla eşleşird 1, 2 veya 3 vb. ile eşleşir. [0-9]
DRakam olmayan herhangi bir karakterle eşleşir D, A, B, g vb. ile eşleşir. [^0-9] 
sHerhangi bir boşlukla eşleşir karakters, yeni satırlar, sekmeler, boşluklar vb. ile eşleşir. 
S -boşluk karakteri S, boşluk karakteri dışında herhangi bir karakterle eşleşir. 
wHerhangi bir kelime karakteriyle eşleşir< /td>Bir kelime karakteri, [a-zA-Z_0-9] için kısa
WKelime olmayan herhangi bir karakterle eşleşir< /td>[W] herhangi bir özel karakterle eşleşir. [^w]
kısaltması

Not: Büyük harfli meta karakterler (W, D, vb.) genellikle küçük harfli meta karakterlerin ne yaptığı (w, d, vb.). 

Niteleştiriciler

Nicelik BelirticiAçıklamaÖrnek
+Birden fazla karakterden biri< /td>d+ iki veya daha fazla rakamla eşleşir
*Ön karakterden sıfır veya daha fazlası.* herhangi bir karakterle 0 veya daha fazla kez eşleşir 
Not: Teknik olarak boş bir dize bu normal ifadeyi yerine getirir!
?Sıfır mı yoksa aşağıdakilerden biri mi? önceki karaktera?.* a, any, merhaba, world 
{number}Ön karakterle tam olarak sayı kez eşleşir d{3} tam olarak üç basamakla [0-9] eşleşir
{num1,num2}Bir sayı aralığında önceki karakterle eşleşird{3,5}, [0-9]
olan 3 ila 5 basamakla eşleşir

Nicelik belirteçlerini, meta karakterleri ve diğerlerini kullanın Eşleştiriciler, normal ifadeleriniz için yapı taşları olarak kullanılır. Burada bahsedilen sözdizimi, normal ifadeler kullanan birden çok dilde benzerdir.


Ancak, örneğin Ruby veya JavaScript'te kullanılan ve Python'a aktarılamayan bazı şeyler vardır.

Biraz öğrenelim sonraki bölümde Python'da normal ifadelerin nasıl çalıştığı hakkında daha fazla bilgi edinin.




Python'da Normal İfadeler Nasıl Çalışır?

Python'da normal ifadeleri kullanmak için re modülünü dosyanızın en üstüne yerleştirin. 

import re string = "Hızlı kahverengi tilki üzerinden atladı tembel köpek" sonuç = re.search("q.+ks", string) # pozitif bir sonuç döndürürse eşleşme nesnesidir. Aksi takdirde bir NoneType nesnesi döndürür, aksi takdirde print(result.span(), "< == Bu, sonucun bulunduğu dizinlerin aralığını içeren demetdir") print(result.string, "<== Bu orijinal dizedir ") print(result.group(), "< ;== Bu, normal ifade kalıbımıza uyan karakter grubudur") ================================== ================================== import re string = """Hızlı kahverengi tilki tembel köpeğin üzerinden atladı " "" sonuç = re.search(""" ^ # Q satırının başlangıcı # değişmez karakter 'Q' . # nokta ==> herhangi bir karakter + # niceleyici == 1 k'den fazla # değişmez karakter 'k' s # özel karakter 's' """, string, flags=re.IGNORECASE | re.M | re.VERBOSE) if sonuç: print(sonuç .span(), "<== Bu, sonucun içinde bulunduğu dizinlerin aralığını içeren demetdir") print(result.string, "<== Bu orijinal dizedir ") print(result.group() , "<== Bu, normal ifade kalıbımıza uyan karakter grubudur") else: print(result) ========================= ======================================== import re print(re.match( "hızlı", str, flags=re.IGNORECASE)) print(re.search("hızlı", str, flags=re.IGNORECASE | re.MULTILINE)) ============= ================================================= === yeniden telefon = "555 555 5555" doğruFormat = re.sub("s", "-", telefon) print(correctFormat) ================== ================================================ ithalat yeniden left_parens = re.sub("^", "(", telefon) right_parens = re.sub("s", ")", left_parens, 1) secondCorrectFormat = re.sub("s", "-", right_pa rens) print(secondCorrectFormat)

Bu kadar basit! Eklemeniz gereken özel bir şey veya indirmeniz gereken paketler yok. İçe aktardığınız sürece, zaten yerleşiktir. 

Eğlence, yeniden modülünde bize sunulan farklı yöntemlerin nasıl kullanılacağından gelir.

re.search(regex, str, flags=0)

Bir dizgeye normal ifade kalıbı uygulamak istediğinizde, kalıbın doğru olup olmadığını görmek için arama işlevini kullanın. dizede bulunur. Bu yöntem, normal bir ifade kalıbı alacak ve onu dizenin herhangi bir yerinde eşleştirecektir.

Düzgün ifade kalıbı dizede DEĞİLSE, yorumlayıcı Yok değerini döndürür. Bir eşleşme varsa, kendisi hakkında bazı bilgiler içeren bir Match nesnesi döndürülür. 

Match nesnesinin bir özelliği vardır ve eşleşme hakkında bilgi almak için kullanılabilecek iki yöntem:

match_obj.span() eşleşmenin başlangıç ​​ve bitiş konumlarını (bitiş) içeren bir tanımlama grubu döndüren bir yöntem. konum kapsayıcıdır).

match_obj.string işleve iletilen dizeyi döndüren bir özellik.

match_obj.group() dizenin eşleşmenin olduğu bölümünü döndüren bir yöntemdir.

match_obj burada re'nizin sonucuna atadığınız değişkenle değiştirilecektir. .search() yöntemi. Her bir yöntemi ve özelliği kullanan bir örnek: 

import re string = "Hızlı kahverengi tilki tembel köpeğin üzerinden atladı" sonuç = re.search("q.+ks", string) # bu, pozitif bir sonuç döndürürse eşleşme nesnesidir. Bir NoneType nesnesi döndürür, aksi takdirde print(result.span(), "<== Bu, sonucun içinde bulunduğu dizinlerin aralığını içeren demetdir") print(result.string, "<== Bu orijinaldir string ") print(result.group(), "<== Bu, normal ifade kalıbımıza uyan karakter grubudur")

Burada hatırlanması gereken en önemli şey, < Python'daki code>Match nesnesinin yöntemleri vardır ve  özellikler.

Normal ifadeyi test ettiğimiz orijinal dizeye erişmek için özellik dizesini, dizinlere erişmek için yayılma yöntemini ve gerçek eşleşen sonucu almak için grup yöntemini kullanırız. < br>

Python belgelerinde başvurulabilecek başka yöntemler ve özellikler vardır, ancak bunlar başlamanıza yardımcı olur. 

İsteğe bağlı argümanlar:  flags

re modülünün arama yöntemiyle de kullanabileceğiniz isteğe bağlı bir argüman vardır. Bunu kullanmak için, kullanmak istediğiniz bayrakların listesine flags parametresini atayın. Varsayılan 0'a ayarlanmıştır. Daha popüler seçeneklerden bazıları şunlardır: 

  • re.DEBUG

Bu bayrak hata ayıklama bilgilerini görüntüler. gerekirse derlenmiş normal ifade hakkında. 

  • re.I
    re.IGNORECASE

Büyük/küçük harfe duyarlı olmayan eşleştirme. Bu, hem büyük hem de küçük harflerin eşleşmesi için kümelere veya değişmez karakterlere geçirilen karakterlerin büyük/küçük harf durumunu yok sayar.

  • re.M
    re.MULTILINE

Çok satırlı mod. Satır başı ve satır sonu normal ifade meta karakterlerinin çok satırlı dizelerde kullanılmasına izin verir. Aksi takdirde, sadece dizenin başına ve sonuna bakardı. Çok satırlı bayrak olmadan, normal ifade motoru dizeyi bir satır olarak kabul eder.

  • re.S
    re.DOTALL

Bu bayrak şunu söyler: nokta karakterinin herhangi bir karakterle eşleşeceği normal ifade motoru. Varsayılan davranış, nokta karakterinin yeni satır karakteri dışında her karakterle eşleşmesidir. 

  • re.X
    re.VERBOSE

Ayrıntılı bayrak, ifadenizi parçalamak ve amacı hakkında yorum yapmak için normal ifadenize yorumlar eklemenize olanak tanır. Python'da normal ifade öğrenirken bu çok yardımcı olabilir. 

Bu kod parçacığı, yukarıdaki örneği alır ve yukarıda listelenen bayraklardan bazılarını içerir. Birden fazla bayrak kullanırken, ayırıcı olarak her birinin arasında bitwise | operatörünü kullanın.

import re string = """Hızlı kahverengi tilki tembel köpeğin üzerinden atladı """ sonuç = re.search(""" ^ # Satır başı Q # değişmez karakter 'Q' # nokta ==> herhangi bir karakter + # niceleyici == 1 k'den fazla # değişmez karakter 'k' s # özel karakter 's' """, string, flags=re .IGNORECASE | re.M | re.VERBOSE) if sonuç: print(result.span(), "<== Bu, inde'nin yayılımını içeren demetdir. xes sonucu") print(result.string, "<== Bu orijinal dizedir ") print(result.group(), "<== Bu, normal ifade kalıbımıza uyan karakter grubudur" ) else: print(result)

Bayrakların dizgemizi test etmede bize nasıl yardımcı olduğunu görmek için zaman ayırın. Flags parametresini çıkarmayı deneyin. Dize bir sonuç döndürüyor mu? Değilse, sonuç olarak ne döndürür? 

Re modülündeki arama yönteminin normal ifadeyi, aranacak dizeyi ve isteğe bağlı flags parametresini aldığını unutmayın. Doğruluk değeri, kendisiyle ilişkilendirilmiş özellikleri ve yöntemleri olan bir Eşleştirme Nesnesi döndürür. Sahte bir değer, bir NoneType nesnesi döndürür. 

re.match(regex, str, flags=0)

  Bir regex modelini dizenin başlangıcıyla eşleştirmek istediğinizde eşleşme yöntemi. Normal ifade modelini dizenin herhangi bir yerinde eşleştirmek istiyorsanız, bunun yerine yukarıdaki arama yöntemini kullanın. 

import re string = """Hızlı kahverengi tilki tembel köpeğin üzerinden atladı """ print(re.match("quick", string, flags=re.IGNORECASE | re.MULTILINE)) print(re.search ("quick", string, flags=re.IGNORECASE | re.MULTILINE))

Bir Python yorumlayıcısında bu koda baktığınızda, ilk yöntemin olduğunu göreceksiniz. match(), bir Match nesnesi döndürmez, bunun yerine None döndürür. İkincisi, dizenin içine bakmayı sağlar ve bir Match nesnesi döndürür. Bunun nedeni, re.MULTILINE işareti kaldırılmış olsa bile match() yönteminin yalnızca dizenin başına bakmasıdır. 

re.sub(findRegex, replaceWith, str, count=0, flags=0)

re modülündeki sub() yöntemi bir regex, bir dizgede en soldaki eşleşmeyi bulur ve onu başka bir şeyle değiştirir. Sayı parametresinde belirtilen sayıda aynı işlemi tekrarlar. Sayı parametresi yoksa veya sıfıra ayarlanırsa, tüm tekrarlar değiştirilir. 

Bu makalenin başında bir telefon numarasını yeniden biçimlendirmekten bahsetmiştik. Bunun nasıl yapılacağına buradan bir göz atalım: 

import re phone = "555 555 5555" CorrectFormat = re.sub("s", "-", phone) print(correctFormat) # 555-555-5555

Bu, telefon dizimizi alır, hepsini bulur boşluk oluşumları ve onu bir tire ile değiştirir. Bu durumda, 555-555-5555 elde ederiz.

Daha zor bir yeniden biçimlendirme deneyelim:

telefonu içe aktar = "555 555 5555" left_parens = re.sub("^", "(", telefon) right_parens = re.sub(" s", ")", left_parens, 1) secondCorrectFormat = re.sub("s", "-", right_parens) print(secondCorrectFormat) # (555)555-5555

In bu örnekte, açık bir parantez eklemek ve bu yeni dizeyi bir değişkene atamak için satırın başına gidiyoruz. 

Ardından yeni atanan değişkeni (left_parens) alıyoruz. ) ve onu yakın parantezlerle değiştirmek için bir sonraki kullanılabilir boşluk karakterini bulmak için aynı işlemi gerçekleştirmek için kullanın. Bu, right_parens öğesine atanır. 

Son olarak, right_parens değişkenini alır ve aynı işlemi son boşluk karakteri üzerinde gerçekleştirmek için kullanırız. onu bir tire ile değiştirin. 

Bu bize (555)555-5555 verecektir. 

Özetlemek gerekirse, alt () yöntemi, bir normal ifade kalıbını, bir değiştirme dizesini veya işlevi, sub() üzerinde gerçekleştirmek istediğimiz gerçek dizeyi ve bir sayıyı alır. Bir sayı sağlamazsak, değiştirmeleri tüm oluşumlarda gerçekleştirir. Gerçekleştirilen ikamelerle birlikte yeni dizeyi döndürür. 




Sonuç

Normal İfadeler, verileri doğrulamanın veya dizelerimizdeki karakterleri aramanın ve değiştirmenin bir yoludur. Normal ifade, bir doğrulama testinden geçip geçmediğini görmek için dizelerimizi test etmek veya Eşleşmeleri aramak ve değiştirmek için kullanılabilen metakarakterler, niceleyiciler ve değişmez karakterlerden oluşur. 

Düzenli ifade biraz olabilir ilk başta bunaltıcıdır, ancak bir kez anladığınızda, biraz bisiklet sürmeye benzer.  Hafızanızın bir köşesinde olacak ve tekrar öğrenmesi çok kolay olacak.

Bu makalede ne olacağı konusunda bir fikriniz olduğunu hissettiğinizde, Python belgelerine bir göz atın. normal ifadelerle başka neler yapılabileceğini görmek için. Derleme ve bölme yöntemlerine kesinlikle bir göz atın. 

Mutlu normal ifadeler!





Python normal ifade: StackOverflow Questions

Tutorials