عبارات با قاعده (regular expressions) در پایتون - قسمت اول

02 آبان 1398
عبارات با قاعده (regular expressions) در پایتون - قسمت اول

کار عبارات با قاعده چیست؟

عبارات با قاعده یا Regular Expression که به صورت خلاصه RegEx نامیده می شوند توالی از کاراکترهای خاص هستند که الگوی یک جست و جو را می سازند. در واقع با استفاده از RegEx می توانیم جست و جو های پیشرفته تری را پیاده سازی کنیم؛ مثلا آیا یک رشته از قاعده و الگوی خاصی پیروی می کند یا خیر؟ استفاده از RegEx در زبان های مختلف، متفاوت است و نسخه های مختلفی از RegEx نیز وجود دارد اما ما در این جلسه روی عبارات با قاعده در پایتون تمرکز خواهیم کرد؛ در زبان پایتون باید ماژول موردنظرش به نام re را وارد کنید:

import re

پس از آنکه ماژول موردنظر را وارد کردید نوبت کار با RegEx است. به طور مثال کد زیر می گوید آیا رشته ی موردنظر با The شروع و با Spain تمام می شود یا خیر:

import re

#Check if the string starts with "The" and ends with "Spain":

txt = "The rain in Spain"
x = re.search("^The.*Spain$", txt)

if (x):
  print("YES! We have a match!")
else:
  print("No match")

خروجی:

YES! We have a match!

به احتمال زیاد چیزی از این کد متوجه نشده اید اما جای نگرانی نیست؛ این تنها یک مثال برای آشنایی شما بود، من قدم به قدم این کد را توضیح می دهم.

توابع و Metacharacter ها

ماژول re چند تابع اصلی برای جست و جو در رشته ها را دارد:

تابع توضیحات
findall لیستی از تمام نتایج را برمی گرداند.
search اگر در رشته نتیجه ای پیدا شد یک Match object (شیء نتیجه) برمی گرداند.
split هر جایی از نتیجه که قطع شده باشد یک list برمی گرداند.
sub یک یا چند نتیجه را با یک رشته replace (عوض کردن) می کند.

ما تک تک این توابع را با مثال توضیح می دهیم اما قبل از آن باید با Metacharacter ها آشنا بشوید. این کاراکترها در RegEx معنی خاصی دارند و یک کاراکتر عادی نیستند. به جدول زیر توجه کنید:

کاراکتر توضیحات
[] نماینده ی مجموعه ای از کاراکترها است. به طور مثال اگر بگوییم [a-m] یعنی تمام حروف الفبای انگلیسی بین حرف a و m. البته از آنجا که آن ها را با حرف کوچک نوشتیم، فقط به دنبال حروف کوچک خواهد گشت.
\ این کاراکتر دو استفاده ی اصلی دارد: 1- نشان دهنده ی special sequence (بعدا آن ها را توضیح خواهیم داد اما برای مثال d\ نشان دهنده ی اعداد است، هر عددی که باشد). 2- برای escape دادن کاراکترهای عادی
. نشان دهنده ی هر کاراکتری که باشد (به غیر از کاراکتر new line - برای رفتن به خط بعد). به طور مثال he..o یعنی رشته ای که با he شروع شود و سپس 2 کاراکتر داشته باشد (دو نقطه) و در آخر با o تمام شود. علامت نقطه اصلا برایش مهم نیست چه نوع کاراکتری است، فقط باید وجود داشته باشد (عدد، حرف و ...)
^ نشان دهنده ی شروع شدن با چیزی. مثلا "hello^" یعنی رشته ی ما باید با عبارت hello شروع شود ولی بقیه ی آن مهم نیست.
$ نشان دهنده ی پایان یافتن با چیزی. به طور مثال "$world" یعنی رشته ی ما باید با world تمام شود ولی قبل از آن مهم نیست.
* نشان دهنده ی این است که فلان قسمت هیچ بار (صفر) یا بیشتر تکرار شود. به طور مثال "*aix" یعنی رشته ی ما دارای ai باشد که پس از آن صفر یا چند بار حرف x وجود داشته باشد؛ مثل aix یا aixx یا aixxx یا ai یا aixxxxxxxx و الی آخر.
+ نشان دهنده ی این است که فلان قسمت یک بار یا بیشتر تکرار شود. به طور مثال "+aix" یعنی رشته ی ما دارای ai باشد که پس از آن حداقل یک بار حرف x وجود داشته باشد؛ مثل aix یا aixx یا aixxx یا aixxxxxxxx و الی آخر (در این حالت ai قبول نیست).
{} تکرار مقداری دقیقا به تعداد ذکر شده باشد. به طور مثال "{al{2" یعنی در رشته ی ما پس از حرف a دقیقا 2 بار حرف انگلیسی l آمده باشد، نه کمتر و نه بیشتر.
| یا x باشد یا y. به طور مثال "falls|stays" یعنی رشته ی ما یا دارای Falls باشد یا دارای stays باشد.
() دستورات و رشته ها را گروه بندی می کند. این مورد استفاده های متعددی دارد که بعدا در مورد آن صحبت می کنیم.

بگذارید چند مثال برایتان بزنم:

مثال اول:

import re

str = "The rain in Spain"

#Find all lower case characters alphabetically between "a" and "m":

x = re.findall("[a-m]", str)
print(x)

خروجی این کد بدین شکل است:

['h', 'e', 'a', 'i', 'i', 'a', 'i']

رشته ی ما The rain in Spain است و گفته ایم در همین رشته [a-m] را پیدا کن، یعنی تمام حروف بین a و m که می شود همان خروجی بالا.

مثال دوم:

import re

str = "hello world"

#Check if the string starts with 'hello':

x = re.findall("^hello", str)
if (x):
  print("Yes, the string starts with 'hello'")
else:
  print("No match")

خروجی:

Yes, the string starts with 'hello'

در این مثال گفته ایم به دنبال رشته ای بگرد که شروعش با hello باشد و اگر رشته ی ما اینچنین بود عبارت 'Yes, the string starts with 'hello را برایمان چاپ کن.

special sequence چیست؟

special sequence (به معنی توالی های خاص) به ترکیباتی گفته می شود که با \ شروع شده و سپس یک کاراکتر ویژه پس از آن قرار داده می شود. هر کدام از این special sequence ها معنی خاص خود را دارد و در جای خاصی استفاده می شود. برای اطلاعات بیشتر به جدول زیر نگاه کنید.

کاراکتر توضیحات
\A این کاراکتر خاص می گوید کاراکترهای پس از آن باید در شروع رشته باشند. به طور مثال "AThe\" یعنی رشته باید با The شروع شود.
\b این کاراکتر می گوید کاراکترهای بعد از آن باید یا در ابتدای کلمه یا در انتهای آن باشند. به طور مثال "r"\bain یعنی ain در ابتدای یک کلمه باشد، "r"ain\b نیز یعنی ain در انتهای کلمه باشد. مورد اول کلمه ی rain را شامل نمی شود چرا که rain در انتهای کلمه است اما مورد دوم rain را شامل می شود.
\B این کاراکتر می گوید کاراکترهای بعد از آن باید در کلمه وجود داشته باشند اما در انتها یا ابتدای آن نباشند. به طور مثال "r"\Bain یعنی ain در کلمه باشد اما در ابتدای آن نباشد (مانند Spain) اما "r"ain\B یعنی ain در کلمه باشد اما در اتهای آن نباشد.
\d یعنی رشته دارای عدد باشد (هر عددی). به طور مثال "d\"
\D یعنی رشته هیچ عددی نداشته باشد. به طور مثال  اگر رشته ی ما The rain in Spain باشد و ما از "D\" استفاده کنیم عبارت صحیح است اما اگر از "d\" استفاده کنیم نتیجه غلط خواهد بود (چرا که رشته هیچ عددی ندارد).
\s یعنی رشته دارای فضای خالی (اسپیس) باشد.
\S یعنی رشته دارای فضای خالی (اسپیس) نباشد. اگر رشته ی خود را The rain in Spain در نظر بگیریم هم \s و هم \S صحیح خواهند بود چرا که در این رشته هم اسپیس داریم و هم کلمات را داریم که بینشان اسپیس نیست.
\w یعنی رشته دارای حروف (از a تا z) و اعداد (0 تا 9) و علامت _ (آندرلاین) باشد.
\W یعنی رشته دارای حروف (از a تا z) و اعداد (0 تا 9) و علامت _ (آندرلاین) نباشد.
\Z یعنی کاراکترهای مشخص شده بعد از خودش در انتهای رشته باشند. به طور مثال اگر رشته The rain in Spain باشد و عبارت جست و جوی ما هم "Spain\Z" باشد، مقدار صحیح خواهد بود.

کار set ها چیست؟

Set ها مجموعه ای از کاراکترها هستند که درون bracket ها (علامت []) قرار گرفته و معنی خاصی دارند. به چند نمونه از آن ها در جدول زیر توجه کنید:

set توضیحات
[arn] یعنی یکی از کاراکترهای a یا r یا n یا همه ی آن ها در رشته حضور داشته باشند.
[a-n] هر کاراکتری بین a و n (بر اساس الفبای انگلیسی) باشد؛ البته فقط حروف کوچک.
[^arn] یعنی هر کاراکتری به جز کاراکترهای a و r و n
[0123] یعنی یکی از اعداد 0 و 1 و 2 و 3 حضور داشته باشند.
[0-9] یعنی هر عددی بین 0 تا 9 وجود داشته باشد یک match (نتیجه) محسوب می شود.
[0-5][0-9] یعنی هر عدد دو رقمی بین 00 و 59
[a-zA-Z] یعنی هر حرفی بین a تا z، چه با حروف بزرگ و چه با حروف کوچک
[+] تمام کاراکترهای خاص (مانند + و * و . و | و () و $ و {} و ...) هیچ معنای خاصی در set ها ندارند. بنابراین [+] یعنی هر کاراکتر + (خود علامت به اضافه).

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

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری از مقدماتی تا پیشرفته با پایتون توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما (1 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

imaniy
27 بهمن 1398
خیلی عالی بود ممنونم.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

امیر زوارمی
04 اسفند 1398
سلام دوست عزیز، خوشحالم که مورد توجه شما بوده!

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.