Karmaşık RegEx Sözdizimi Olmadan Python Dize Eşleştirme

Karmaşık RegEx Sözdizimi Olmadan Python Dize Eşleştirme

Kaynak Düğüm: 1935271

Karmaşık RegEx Sözdizimi Olmadan Python Dize Eşleştirme
Yazara göre resim
 

Özellikle Python'da düzenli ifadelerle (RegEx) sevgi ve nefret ilişkim var. Birden çok mantıksal işlev yazmadan dizeleri nasıl ayıklayabileceğinizi veya eşleştirebileceğinizi seviyorum. String arama işlevinden bile daha iyidir. 

Sevmediğim şey, RegEx kalıplarını öğrenmenin ve anlamanın benim için ne kadar zor olduğu. Tüm alfasayısal karakterleri ayıklamak ve NLP görevleri için metni temizlemek gibi basit Dize eşleştirme ile başa çıkabilirim. Önemsiz metinden IP adreslerini, e-postaları ve kimlikleri ayıklamak söz konusu olduğunda işler daha da zorlaşıyor. Gerekli öğeyi çıkarmak için karmaşık bir RegEx String kalıbı yazmanız gerekir. 

Karmaşık RegEx görevlerini basitleştirmek için, adında basit bir Python Paketi hakkında bilgi edineceğiz. pregeks. Ayrıca, uzun bir metin dizisinden tarih ve e-posta çıkartmaya ilişkin birkaç örneğe de bakacağız.  

Pregeks "re" modülünün üzerine inşa edilmiş daha üst düzey bir API'dir. Herhangi bir programcının normal ifadeleri anlamasını ve hatırlamasını kolaylaştıran, karmaşık RegEx kalıpları içermeyen bir RegEx'tir. Dahası, kalıpları gruplandırmanız veya meta karakterlerden kaçmanız gerekmez ve modülerdir. 

Kütüphaneyi PIP kullanarak kurabilirsiniz.

pip install pregex

 

PRgEx'in güçlü işlevselliğini test etmek için, değiştirilmiş örnek kodu kullanacağız. belgeleme

Aşağıdaki örnekte, HTTP URL'sini veya bağlantı noktası numarasına sahip bir IPv4 adresini çıkarıyoruz. Bunun için karmaşık bir mantık oluşturmamıza gerek yok. Yerleşik "HttpUrl" ve "IPv4" işlevlerini kullanabiliriz.

  1. AnyDigit() kullanarak bir bağlantı noktası numarası oluşturun. Bağlantı noktasının ilk basamağı sıfır olmamalı ve sonraki üç basamak herhangi bir sayı olabilir. 
  2. Bir bağlantı noktası numarasına sahip HTTP URL'si veya IP adresi ayıklamak için birden fazla mantık eklemek için Ya()'yı kullanın. 
from pregex.core.pre import Pregex
from pregex.core.classes import AnyDigit
from pregex.core.operators import Either
from pregex.meta.essentials import HttpUrl, IPv4 port_number = (AnyDigit() - '0') + 3 * AnyDigit() pre = Either( HttpUrl(capture_domain=True, is_extensible=True), IPv4(is_extensible=True) + ':' + port_number
)

 

Karakterleri ve açıklamaları olan uzun bir metin dizisi kullanacağız. 

text = """IPV4--192.168.1.1:8000-- address--https://www.abid.works-- website--https://kdnuggets.com--text"""

 

Eşleşen dizeyi çıkarmadan önce, RegEx modeline bakalım. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

Çıktı

Gördüğümüz gibi, neler olup bittiğini okumak, hatta anlamak bile zor. Burası PRgEx'in parladığı yerdir. Karmaşık normal ifade görevlerini gerçekleştirmeniz için size insan dostu bir API sağlamak. 

(?:https?://)?(?:www.)?(?:[a-zdA-Z][a-z-dA-Z]{,61}[a-zdA-Z].)*([a-zdA-Z][a-z-dA-Z]{,61}[a-zdA-Z]).[a-z]{2,6}(?::d{1,4})?(?:/[!-.0-~]+)*/?(?:(?=[!-/[-`{-~:-@])|(?=w))|(?:(?:d|[1-9]d|1d{2}|2(?:[0-4]d|5[0-5])).){3}(?:d|[1-9]d|1d{2}|2(?:[0-4]d|5[0-5])):[1-9]d{3}

 

Tıpkı "re.match" gibi, gerekli dizeyi çıkarmak için ".get_matches(text)" kullanacağız.

results = pre.get_matches(text)
print(results)

 

Çıktı

Hem port numaralı IP adresini hem de iki web URL'sini çıkardık. 

['192.168.1.1:8000', 'https://www.abid.works', 'https://kdnuggets.com']

PRgEx'in tüm potansiyelini anlayabileceğimiz birkaç örneğe bakalım. 

Bu örnekte, aşağıdaki metinden belirli tarih kalıplarını çıkaracağız.

text = """ 04-15-2023 2023-08-15 06-20-2023 06/24/2023 """

 

Exactly() ve AnyDigit() kullanarak tarihin gününü, ayını ve yılını oluşturacağız. Gün ve ay iki haneli, yıl ise 4 hanelidir. “-” tire ile ayrılırlar.

Modeli oluşturduktan sonra, eşleşen String'i çıkarmak için get_match'i çalıştıracağız. 

from pregex.core.classes import AnyDigit
from pregex.core.quantifiers import Exactly day_or_month = Exactly(AnyDigit(), 2) year = Exactly(AnyDigit(), 4) pre = ( day_or_month + "-" + day_or_month + "-" + year
) results = pre.get_matches(text)
print(results)

 

Çıktı

['04-15-2023', '06-20-2023']

 

`get_pattern()` işlevini kullanarak RegEx kalıbına bakalım. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

Çıktı

Gördüğümüz gibi, basit bir RegEx sözdizimine sahip. 

d{2}-d{2}-d{4}

İkinci örnek, önemsiz metinden geçerli e-posta adreslerini çıkaracağımız biraz karmaşıktır. 

text = """ user1@abid.works editorial@@kdnuggets.com lover@python.gg. editorial1@kdnuggets.com """

 

  • Hat için bir kullanıcı "OneOrMore()" ile desen. Mantıktan “@” ve boşluk kaldırmak için `AnyButFrom()` kullanacağız. 
  • Benzer bir kullanıcı oluşturduğumuz desen şirket "." ek karakterini kaldırarak desen mantıktan.
  • Için alanı,  aramayı “@”, boşluk ve nokta dışında iki veya daha fazla karakterle sondan başlatmak için `MatchAtLineEnd()` kullanacağız.  
  • Son deseni oluşturmak için üçünü de birleştirin: kullanıcı@şirket.etki alanı.
from pregex.core.classes import AnyButFrom
from pregex.core.quantifiers import OneOrMore, AtLeast
from pregex.core.assertions import MatchAtLineEnd user = OneOrMore(AnyButFrom("@", ' '))
company = OneOrMore(AnyButFrom("@", ' ', '.'))
domain = MatchAtLineEnd(AtLeast(AnyButFrom("@", ' ', '.'), 2)) pre = ( user + "@" + company + '.' + domain
) results = pre.get_matches(text)
print(results)

 

Çıktı

Gördüğümüz gibi, PRgEx iki geçerli e-posta adresi belirledi. 

['user1@abid.works', 'editorial1@kdnuggets.com']

 

Not: her iki kod örneği de çalışmanın değiştirilmiş sürümleridir. PyKoç

Bir veri bilimcisi, analist veya NLP meraklısıysanız, metni temizlemek ve basit mantık oluşturmak için PRgEx kullanmalısınız. Eşleştirmenin çoğu basit API kullanılarak yapılabildiğinden, NLP çerçevelerine olan bağımlılığınızı azaltacaktır. 

Bu mini öğreticide, PRgEx Python paketini ve kullanım durumlarını örneklerle öğrendik. Resmi okuyarak daha fazlasını öğrenebilirsiniz. belgeleme ya da çözmek Wordle programlanabilir düzenli ifadeler kullanma sorunu.

 
 
Abid Ali Avan (@1abidaliwan), makine öğrenimi modelleri oluşturmayı seven sertifikalı bir veri bilimcisi uzmanıdır. Şu anda, makine öğrenimi ve veri bilimi teknolojileri üzerine içerik oluşturmaya ve teknik bloglar yazmaya odaklanıyor. Abid, Teknoloji Yönetimi alanında yüksek lisans ve Telekomünikasyon Mühendisliği alanında lisans derecesine sahiptir. Vizyonu, akıl hastalığı ile mücadele eden öğrenciler için bir grafik sinir ağı kullanarak bir AI ürünü oluşturmaktır.
 

Zaman Damgası:

Den fazla KDNuggets