سلام اسم من مصطفئست، علاقه مند به زبان پایتون و یادگیری چیز های جدید.
با PRegEx در پایتون regex را خواناتر بنویسید!
اگه یه نیم نگاهی به تاریخچهی زبان برنامه نویسی پایتون بندازیم، میبینیم که آقای Guido Van Rossum و دیگر Core Developer های پایتون، سعی و تاکید بر سادگی و خوانایی این زبان دارند، و به هر شکلی سعی میکنن تا این زبان سادگی و خوانایی خودشو حفظ کنه. اگه یه برنامه نویس پایتون باشید حتما متوجه این موضوع شدید که در پایتون پیادهسازی هر چیزی ممکن است آسان تر از بقیه زبان ها باشد (بدون تعصب و یا بد جلوه دادن زبان های دیگه) اما با این وجود در پایتون مباحثی هس که ممکنه حتی پیادهسازی اونها با وجود سادگی این زبان کار دشوار و خستهکنندهای باشه. یکی از این مباحث، نوشتن یک الگوی عبارات منظم، یا همان Regular به اختصار regex) است که خب البته در این مورد ممکنه نوشتن یک الگوی regex در باقی زبانها هم یک کار سخت و حوصله سر بر باشد.
بیایید تا با یک مثلا جلو بریم :
تصور کنید یک متن دارید که شامل یک یا چند URL میباشد و شما نیاز دارید تا آن URL هارا از متن استخراج کنید. برای مثال متن شما ممکن است به شکل زیر باشد :
بسیار خب ما تو این متن دو URL داریم که میخواییم اون هارو استخراج کنیم. برای استخراج شون باید یک الگوی regex به این شکل بنویسیم :
\b(?:https?://)?\w*(?:\.org/?|\.com/?)[^\s]+
کد کامل این برنامه به شکل زیر است :
به طور خلاصه : ما تو این الگو گفتیم بیا هر url ای که با http یا https شروع میشه و با org. یا com. تموم میشه رو از متن استخراج کن در نهایت تابع findall تمام اون url هارو به صورت لیست به ما تحویل میده.
خب اگه به الگویی که برای regex نوشتیم نگاه کنید میبینید که میتونه چقدر سخت، ناخوانا و آزار دهنده باشه و اگه یکم الگوی شما رفته رفته پیچیده بشه موقع دیدنش انگار جن دیدید و ساعت ها باید بشنید و همه ی الگو هارو تجذیه کنید تا بفهمید چی به چیه ممکن ام هس حتی اینکارو نکنید و ولش کنید به امون خدا 8)
خب شاید بگید پایتون همه چیو برای ما آسون کرده و کوتاهی نکرده پس چرا برای regex هیچ ابزاری نیس که بشه یکم خواناتر الگو نوشت و حداقل یکم Human-Readable باشه؟
خب پس بذارید بهتون بگم که برای اینکارم ما تو پایتون ابزار داریم!!
کتابخونهی PRegEx
کتابخونه ی pregex که به تازگی منتشر شده یک کتابخونه برای کار با regex در پایتون به صورت Human-Readable تره..یعنی شما الگو های regex رو حدودا نزدیک تر به زبان انسان مینویسید.
بیایید مثال بالارو با استفاده از این کتابخونه پیاده سازی کنیم :
این کد دقیقا همون خروجی بالارو به ما میده اما تفاوتش اینه که خیلی خواناتره!
ما الگوهای خودمونو با استفاده از چندتا کلاس پایتونی نوشتیم و دقیقا خروجی که میخواستیم رو بهمون داد
خب حالا بیاییم ببینیم اون کلاس ها چکار میکنن :
- کلاس Optional: این کلاس میاد اون کاراکتر هایی که براش مشخص کردیم رو بر اساس الگویی که بهش میدیم اختیاری در نظر میگیره. (مطابق با ?)
- کلاس AtLeastOnce: اشاره داره به اینکه اون کاراکتر های ما طبق الگویی که تعیین کردیم یک یا بیشتر از یک بار تکرار شده یا نه. (مطابق با +)
- کلاس AnyButWhitespace: این کلاس کارش اینه که هر الگویی که شامل کاراکتر باشه رو برای ما میگیره به جز space ها یا همون فضا های خالی. (مطابق با S\)
در نهایت تمام این الگو هارو به هم میچسبونیم و با استفاده از متد get_matches عه آبجکت pre که یک نمونه از کلاس Pregex هس میاییم و اون الگویی که ساختیم رو داخل رشته مون اعمال میکنیم.
البته نا گفته نمونه که خود این کتابخونه داره از ماژول re عه پایتون که جزو stdlib های پایتون هس استفاده میکنه اما به صورت یک Interface که در واقع برای آسون تر کردن نوشتن الگوهای regex هست
ممنون از کسایی که این مقاله رو مطالعه کردن :)
داکیومنت : What is pregex? — pregex 1.0.5 documentation
گیتهاب : manoss96/pregex: PRegEx - Programmable Regular Expressions (github.com)
مطلبی دیگر از این انتشارات
آیندهٔ تولید محتوای متنی؛ آیا به پایان نزدیک شدیم؟
مطلبی دیگر از این انتشارات
تجربه کاری من با ریداکس و context
مطلبی دیگر از این انتشارات
فارسی و انگلیسی، کنار هم، مثل آدم!