تطبیق رشته پایتون بدون نحو پیچیده RegEx

تطبیق رشته پایتون بدون نحو پیچیده RegEx

گره منبع: 1935271

تطبیق رشته پایتون بدون نحو پیچیده RegEx
تصویر توسط نویسنده
 

من با عبارات منظم (RegEx) به خصوص در پایتون رابطه عشق و نفرت دارم. من عاشق این هستم که چگونه می توانید رشته ها را بدون نوشتن چندین تابع منطقی استخراج یا مطابقت دهید. حتی بهتر از تابع جستجوی رشته است. 

چیزی که من دوست ندارم این است که یادگیری و درک الگوهای RegEx برای من سخت است. من می توانم با تطبیق ساده رشته ها، مانند استخراج همه کاراکترهای عددی الفا و پاک کردن متن برای کارهای NLP، کار کنم. وقتی صحبت از استخراج آدرس های IP، ایمیل ها و شناسه ها از متن ناخواسته می شود، کار سخت تر می شود. برای استخراج آیتم مورد نیاز باید یک الگوی رشته RegEx پیچیده بنویسید. 

برای ساده کردن وظایف پیچیده RegEx، با یک بسته ساده پایتون به نام پکیج آشنا خواهیم شد pregex. علاوه بر این، ما همچنین به چند نمونه از استخراج تاریخ و ایمیل از یک رشته طولانی متن نگاه خواهیم کرد.  

Pregex یک API سطح بالاتری است که در بالای ماژول «re» ساخته شده است. این یک RegEx بدون الگوهای پیچیده RegEx است که درک و یادآوری عبارات منظم را برای هر برنامه نویسی آسان می کند. علاوه بر این، شما نیازی به گروه بندی الگوها یا فرار از متاکاراکترها ندارید و مدولار است. 

شما به سادگی می توانید کتابخانه را با استفاده از PIP نصب کنید.

pip install pregex

 

برای آزمایش عملکرد قدرتمند PRegEx، از کد نمونه اصلاح شده استفاده می کنیم مستندات

در مثال زیر، ما URL HTTP یا آدرس IPv4 را با شماره پورت استخراج می کنیم. لازم نیست منطق پیچیده ای برای آن ایجاد کنیم. ما می توانیم از توابع داخلی «HttpUrl» و «IPv4» استفاده کنیم.

  1. با استفاده از AnyDigit() یک شماره پورت ایجاد کنید. رقم اول پورت نباید صفر باشد و سه رقم بعدی می تواند هر عددی باشد. 
  2. از یا () برای اضافه کردن چندین منطق برای استخراج، URL HTTP یا آدرس IP با شماره پورت استفاده کنید. 
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
)

 

ما از یک رشته متن طولانی با کاراکترها و توضیحات استفاده خواهیم کرد. 

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

 

قبل از استخراج رشته مطابق، بیایید به الگوی RegEx نگاه کنیم. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

تولید

همانطور که می بینیم، خواندن یا حتی درک آنچه در حال وقوع است دشوار است. اینجاست که PRegEx می درخشد. برای ارائه یک API انسان پسند برای انجام وظایف پیچیده بیان منظم. 

(?: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}

 

درست مانند «re.match»، ما از «.get_matches(text)» برای استخراج رشته مورد نیاز استفاده خواهیم کرد.

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

 

تولید

ما آدرس IP را با شماره پورت و دو URL وب استخراج کرده ایم. 

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

بیایید به چند مثال نگاه کنیم که در آن می‌توانیم پتانسیل کامل PRegEx را درک کنیم. 

در این مثال، ما انواع خاصی از الگوهای تاریخ را از متن زیر استخراج خواهیم کرد.

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

 

با استفاده از Exactly() و AnyDigit()، روز، ماه و سال تاریخ را ایجاد می کنیم. روز و ماه دو رقمی است در حالی که سال 4 رقمی است. آنها با خط تیره "-" از هم جدا می شوند.

پس از ایجاد الگو، «get_match» را برای استخراج رشته منطبق اجرا می کنیم. 

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)

 

تولید

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

 

بیایید با استفاده از تابع "get_pattern()" به الگوی RegEx نگاه کنیم. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

تولید

همانطور که می بینیم، یک نحو ساده RegEx دارد. 

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

مثال دوم کمی پیچیده است، جایی که آدرس های ایمیل معتبر را از متن ناخواسته استخراج می کنیم. 

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

 

  • ایجاد یک کاربر الگوی با «OneOrMore()». ما از «AnyButFrom()» برای حذف «@» و فاصله از منطق استفاده خواهیم کرد. 
  • شبیه به یک کاربر الگویی که ایجاد می کنیم a شرکت با حذف کاراکتر اضافی "." از منطق
  • برای دامنه،  ما از «MatchAtLineEnd()» برای شروع جستجو از انتها با هر دو یا چند کاراکتر به جز «@»، فاصله و نقطه استفاده خواهیم کرد.  
  • هر سه را با هم ترکیب کنید تا الگوی نهایی ایجاد شود: user@company.domain.
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)

 

تولید

همانطور که می بینیم، PRegEx دو آدرس ایمیل معتبر را شناسایی کرده است. 

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

 

توجه داشته باشید: هر دو نمونه کد، نسخه های اصلاح شده کار هستند PyCoach

اگر شما یک دانشمند داده، تحلیلگر یا علاقه مند به NLP هستید، باید از PRegEx برای پاک کردن متن و ایجاد منطق ساده استفاده کنید. این امر وابستگی شما به چارچوب های NLP را کاهش می دهد زیرا بیشتر تطابق ها با استفاده از API ساده انجام می شود. 

در این مینی آموزش با پکیج Python PRegEx و موارد استفاده از آن همراه با مثال آشنا شدیم. با خواندن رسمی می توانید اطلاعات بیشتری کسب کنید مستندات یا حل الف وردل مشکل استفاده از عبارات منظم قابل برنامه ریزی

 
 
عابد علی اعوان (@1abidaliawan) یک متخصص دانشمند داده معتبر است که عاشق ساخت مدل های یادگیری ماشینی است. در حال حاضر، او بر تولید محتوا و نوشتن وبلاگ های فنی در زمینه یادگیری ماشین و فناوری های علم داده تمرکز دارد. عابد دارای مدرک کارشناسی ارشد در رشته مدیریت فناوری و مدرک کارشناسی در رشته مهندسی مخابرات است. چشم انداز او ساخت یک محصول هوش مصنوعی با استفاده از یک شبکه عصبی نمودار برای دانش آموزانی است که با بیماری های روانی دست و پنجه نرم می کنند.
 

تمبر زمان:

بیشتر از kdnuggets