شنبه ۲۹ دي ۱۴۰۳
Tut24 آموزش برنامه نویسی و مجله تخصصی فناوری ورود/عضویت

آموزش پایتون - عبارات منظم

یک عبارت منظم (regular expression) یک توالی خاص از کاراکترها است که به شما کمک می‌کند سایر رشته‌ها یا مجموعه‌های رشته‌ای را پیدا یا مطابقت دهید، با استفاده از یک نوشتار ویژه که در ساختار الگویی می باشد. عبارات منظم به طور گسترده در دنیای یونیکس استفاده می‌شوند.

ماژول پایتون re پشتیبانی کاملی را برای عبارات منظم شبیه به پرل در پایتون فراهم می‌کند. اگر در هنگام کامپایل یا استفاده از یک عبارت منظم خطا رخ دهد، ماژول re استثنا re.error را ایجاد می‌کند.

ما دو تابع مهم را که برای کار با عبارات منظم استفاده می‌شوند، پوشش خواهیم داد. با این توضیح مختصر که کاراکترهای مختلف وقتی در عبارت منظم استفاده می‌شوند، معنای ویژه‌ای دارند. برای جلوگیری از هرگونه ابهام در هنگام کار با عبارات منظم، ما از رشته‌های خام (Raw Strings) به صورت r'expression' استفاده خواهیم کرد.

تابع match

این تابع سعی می‌کند با استفاده از عبارت منظم pattern، رشته string را با استفاده از پرچم‌های اختیاری flags مطابقت دهد.

در ادامه نحوه استفاده از این تابع آورده شده است −

re.match(pattern, string, flags=0)

اینجا توضیحاتی در مورد پارامترها آمده است −

شماره پارامتر و توضیحات
1

pattern

این عبارت منظم است که باید مطابقت داشته باشد.

2

string

این رشته است که در ابتدای آن الگو بررسی می‌شود.

3

flags

شما می‌توانید از OR بیتی (|) برای مشخص کردن پرچم‌های مختلف استفاده کنید. اینها اصلاح‌گرها هستند که در جدول زیر لیست شده‌اند.

تابع re.match یک شیء match را در صورت موفقیت برمی‌گرداند و در صورت عدم موفقیت، None را برمی‌گرداند. ما از تابع group(num) یا groups() شیء match برای دریافت عبارت مطابقت‌یافته استفاده می‌کنیم.

شماره متد و توضیحات شیء مطابقت (Match Object)
1

group(num=0)

این متد تمام مطابقت (یا زیرگروه خاص num) را برمی‌گرداند.

2

groups()

این متد تمام زیرگروه‌های مطابقت‌یافته را به صورت یک تاپل برمی‌گرداند (اگر هیچ زیرگروهی وجود نداشته باشد، تاپل خالی است)

مثال

import re

line = "Cats are smarter than dogs"

matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)

if matchObj:
   print("matchObj.group() : ", matchObj.group())
   print("matchObj.group(1) : ", matchObj.group(1))
   print("matchObj.group(2) : ", matchObj.group(2))
else:
   print("No match!!")

وقتی کد بالا اجرا می‌شود، نتیجه زیر را تولید می‌کند −

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

تابع search

این تابع برای جستجوی اولین وقوع الگوی عبارت منظم pattern در رشته string با استفاده از پرچم‌های اختیاری flags استفاده می‌شود.

در ادامه نحوه استفاده از این تابع آورده شده است −

re.search(pattern, string, flags=0)

در ادامه توضیحاتی در مورد پارامترها آمده است −

شماره پارامتر و توضیحات
1

pattern

این عبارت منظم است که باید مطابقت داشته باشد.

2

string

این رشته است که در هر جایی از آن الگو بررسی می‌شود.

3

flags

شما می‌توانید از OR بیتی (|) برای مشخص کردن پرچم‌های مختلف استفاده کنید. اینها اصلاح‌گرها هستند که در جدول زیر لیست شده‌اند.

تابع re.search یک شیء match را در صورت موفقیت برمی‌گرداند و در صورت عدم موفقیت، none را برمی‌گرداند. ما از تابع group(num) یا groups() شیء match برای دریافت عبارت مطابقت‌یافته استفاده می‌کنیم.

شماره متد‌ها و توضیحات شیء مطابقت (Match Object)
1

group(num=0)

این متد تمام مطابقت (یا زیرگروه خاص num) را برمی‌گرداند.

2

groups()

این متد تمام زیرگروه‌های مطابقت‌یافته را به صورت یک تاپل برمی‌گرداند (اگر هیچ زیرگروهی وجود نداشته باشد، تاپل خالی است)

مثال

import re

line = "Cats are smarter than dogs";

searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)

if searchObj:
   print("searchObj.group() : ", searchObj.group())
   print("searchObj.group(1) : ", searchObj.group(1))
   print("searchObj.group(2) : ", searchObj.group(2))
else:
   print("Nothing found!!")

وقتی کد بالا اجرا می‌شود، نتیجه زیر را تولید می‌کند −

searchObj.group() :  Cats are smarter than dogs
searchObj.group(1) :  Cats
searchObj.group(2) :  smarter

مطابقت در مقابل جستجو

پایتون دو عملکرد ابتدایی مبتنی بر عبارات منظم ارائه می‌دهد: عملکرد match فقط در ابتدای رشته بررسی می‌کند، در حالی که عملکرد search در هر جایی از رشته بررسی می‌کند (این کاری است که پرل به طور پیش‌فرض انجام می‌دهد).

مثال

import re

line = "Cats are smarter than dogs";

matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
   print("match --> matchObj.group() : ", matchObj.group())
else:
   print("No match!!")

searchObj = re.search( r'dogs', line, re.M|re.I)
if searchObj:
   print("search --> searchObj.group() : ", searchObj.group())
else:
   print("Nothing found!!")

وقتی کد بالا اجرا می‌شود، نتیجه زیر را تولید می‌کند −

No match!!
search --> searchObj.group() :  dogs

جستجو و جایگزینی

یکی از مهم‌ترین متدهای re که از عبارات منظم استفاده می‌کند، متد sub است.

re.sub(pattern, repl, string, max=0)

این متد تمامی موارد تطبیق یافته با عبارت منظم pattern در رشته string را با repl جایگزین می‌کند و همه‌ی تطابق‌ها را جایگزین می‌کند مگر اینکه max مقداردهی شده باشد. این متد رشته‌ی تغییر یافته را برمی‌گرداند.

مثال

import re

phone = "2004-959-559 # This is Phone Number"

# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print("Phone Num : ", num)

# Remove anything other than digits
num = re.sub(r'\D', "", phone)    
print("Phone Num : ", num)

زمانی که کد بالا اجرا می‌شود، نتیجه زیر را تولید می‌کند −

Phone Num :  2004-959-559
Phone Num :  2004959559

اصلاحگرهای عبارت منظم

عبارت منظم می‌تواند شامل یک اصلاحگر اختیاری باشد که کنترل اجزای مختلفی از عملیات تطابق را انجام می‌دهد. اصلاحگرها به عنوان یک پرچم اختیاری مشخص می‌شوند. شما می‌توانید از عملگر XOR (|) برای ارائه چندین اصلاحگر استفاده کنید، همانطور که قبلاً نشان داده شد و می‌تواند توسط یکی از موارد زیر نمایش داده شود −

شماره اصلاحگر و توضیحات
۱

re.I

تطابق را بدون توجه به بزرگی یا کوچکی حروف انجام می‌دهد.

۲

re.L

کلمات را بر اساس تنظیمات لوکال فعلی تفسیر می‌کند. این تفسیر بر رفتار گروه الفبایی (\w و \W) و همچنین رفتار مرز کلمه (\b و \B) تأثیر می‌گذارد.

۳

re.M

باعث می‌شود علامت $ با انتهای خط (نه فقط انتهای رشته) و علامت ^ با شروع هر خط (نه فقط شروع رشته) تطابق کند.

۴

re.S

علامت نقطه (dot) با هر کاراکتر، از جمله خط جدید، تطابق می‌کند.

۵

re.U

حروف را بر اساس مجموعه کاراکترهای یونیکد تفسیر می‌کند. این پرچم تأثیری بر رفتار \w، \W، \b، \B دارد.

۶

re.X

به صورت مجاز از نحو عبارت منظم "زیباتر" استفاده می‌کند. فضای سفید را نادیده می‌گیرد (به جز در داخل مجموعه [] وقتی که توسط براکت قابل اصلاح) و # بدون گریز به عنوان نشانگر توضیح در نظر می‌گیرد.

الگوهای عبارت منظم

به جز کاراکترهای کنترل، (+ ? . * ^ $ ( ) [ ] { } | \)، تمام کاراکترها خود با خود تطابق می‌یابند. شما می‌توانید با قبل از آن قرار دادن یک براکت ، یک کاراکتر کنترلی را انجام دهید .

جدول زیر نحوه نوشتار عبارت منظم را که در پایتون موجود است، نمایش می‌دهد −

شماره الگو و توضیحات
۱

^

ابتدای خط را تطابق می‌دهد.

۲

$

انتهای خط را تطابق می‌دهد.

۳

.

یک کاراکتر 

۱۴

(?imx)

موقتاً گزینه‌های i، m و x را در یک عبارت منظم فعال می‌کند. اگر در پرانتز باشد، فقط در آن قسمت اعمال می‌شود.

۱۵

(?-imx)

موقتاً گزینه‌های i، m و x را در یک عبارت منظم غیرفعال می‌کند. اگر در پرانتز باشد، فقط در آن قسمت اعمال می‌شود.

۱۶

(?: re)

عبارت منظم را گروه بندی می‌کند بدون به خاطر سپردن متن تطابق یافته.

۱۷

(?imx: re)

موقتاً گزینه‌های i، m و x را در پرانتز فعال می‌کند.

۱۸

(?-imx: re)

موقتاً گزینه‌های i، m و x را در پرانتز غیرفعال می‌کند.

۱۹

(?#...)

توضیح.

۲۰

(?= re)

موقعیت را با استفاده از الگو مشخص می‌کند. محدوده ای ندارد.

۲۱

(?! re)

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

۲۲

(?> re)

الگوی مستقل را بدون بازگشت به عقب تطابق می‌دهد.

۲۳

w\

کاراکترهای کلمه را تطابق می‌دهد.

۲۴

W\

کاراکترهای غیرکلمه را تطابق می‌دهد.

۲۵

s\

فضای سفید را تطابق می‌دهد. معادل با [\t\n\r\f] است.

۲۶

S\

غیرفضای سفید را تطابق می‌دهد.

۲۷

d\

اعداد را تطابق می‌دهد. معادل با [0-9] است.

۲۸

D\

غیراعداد را تطابق می‌دهد.

۲۹

A\

ابتدای رشته را تطابق می‌دهد.

۳۰

Z\

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

۳۱

z\

انتهای رشته را تطابق می‌دهد.

۳۲

G\

نقطه‌ای را تطابق می‌دهد که آخرین تطابق به پایان رسیده است.

۳۳

b\

حدود کلمه را تطابق می‌دهد زمانی که خارج از براکت باشد. وقتی داخل براکت باشد، به بازگشت (0x08) می‌تابد.

۳۴

B\

حدود غیرکلمه را تطابق می‌دهد.

۳۵

n, \t\, و غیره

تطابق با خط جدید، رفتن به خط بعد، تب و غیره.

۳۶

1\...9\

تطابق با زیرعبارت گروه بندی شده اول.

۳۷

10\

تطابق با زیرعبارت گروه بندی شده اول اگر قبلاً تطابق یافته باشد. در غیر این صورت، به نمایشگاه هشتگانه کد کاراکتر ارجاع می‌دهد.

نمونه‌های عبارات منظم

کاراکترهای حرفی

ردیف نمونه و توضیحات
۱

پایتون (Python)

تطابق با "پایتون" (Python) را دارد.

کلاس‌های کاراکتری

ردیف نمونه و توضیحات
۱

[Pp]ython (Python)

تطابق با "پایتون" (Python) یا "پایتون" (python) را دارد.

۲

روبی (Ruby)

تطابق با "روبی" (Ruby) یا "روبه" (Rube) را دارد.

۳

[aeiou]

تطابق با هر یک از حروف کوچک صدایی

۴

[0-9]

تطابق با هر رقم؛ همانند [0123456789]

۵

[a-z]

تطابق با هر حرف کوچک ASCII

۶

[A-Z]

تطابق با هر حرف بزرگ ASCII

۷

[a-zA-Z0-9]

تطابق با هر یک از موارد فوق

۸

[^aeiou]

تطابق با هر چیزی به جز یک حرف صدایی کوچک

۹

[^0-9]

تطابق با هر چیزی به جز یک رقم

کلاس‌های حرفی خاص

ردیف نمونه و توضیحات
۱

.

تطابق با هر کاراکتری به جز خط جدید

۲

d\

تطابق با یک رقم: [0-9]

۳

D\

تطابق با یک غیررقم: [^0-9]

۴

s\

تطابق با یک کاراکتر فاصله‌گذاری: [ \t\r\n\f]

۵

S\

تطابق با یک غیرفاصله‌گذاری: [^ \t\r\n\f]

۶

w\

تطابق با یک کاراکتر کلمه تک: [A-Za-z0-9_]

۷

W\

تطابق با یک غیرکلمه تک: [^A-Za-z0-9_]

حالت‌های تکرار

ردیف نمونه و توضیحات
۱

روبی؟ (Ruby?)

تطابق با "روب" (Rub) یا "روبی" (Ruby): حرف y اختیاری است

۲

روبی* (Ruby*)

تطابق با "روب" (Rub) به همراه 0 یا بیشتر حرف y

۳

روبی+ (Ruby+)

تطابق با "روب" (Rub) به همراه 1 یا بیشتر حرف y

۴

d{3}\

تطابق دقیقاً با ۳ رقم

۵

d{3,}\

تطابق با ۳ یا بیشتر رقم

۶

d{3,5}\

تطابق با ۳، ۴ یا ۵ رقم

تکرار 

این با کمترین تعداد تکرار تطابق می‌کند −

ردیف نمونه و توضیحات
۱

<.*>

تکرار : تطابق با "<پایتون>پرل>"

۲

<.*?>

تکرار : تطابق با "<پایتون>" در "<پایتون>پرل>"

گروه‌بندی با پرانتز

شماره نمونه و توضیحات
۱

D\d\+

بدون گروه: + \d را تکرار می‌کند

۲

(\D\d)+

گروه‌بندی شده: + جفت \D\d را تکرار می‌کند

۳

([Pp]ython(, )?)+

تطابق با "پایتون"، "پایتون، python، python" و غیره

مراجع بازگشتی

این بازگشتی را بازتطابق می‌کند −

شماره نمونه و توضیحات
۱

([Pp])ython&\1ails

تطابق با python&pails یا Python&Pails

۲

(['"])[^\1]*\1

رشته با نقل قول تک یا دوتایی. \1 بازگشتی با مطابقت با گروه اول است. \2 بازگشتی با مطابقت با گروه دوم است و غیره

جایگزینی‌ها

شماره نمونه و توضیحات
۱

python|perl

تطابق با "پایتون" یا "پرل"

۲

rub(y|le))

تطابق با "روبی" یا "روبل"

۳

Python(!+|\?)

"پایتون" توسط یک یا بیشتر علامت تعجب یا یک علامت سوال دنبال می‌شود

نشانه‌گذارها

برای مشخص کردن موقعیت تطابق نیاز است.

شماره نمونه و توضیحات
۱

^Python

تطابق با "پایتون" در ابتدای یک رشته یا خط داخلی

۲

Python$

تطابق با "پایتون" در انتهای یک رشته یا خط

۳

\APython

تطابق با "پایتون" در ابتدای یک رشته

۴

Python\Z

تطابق با "پایتون" در انتهای یک رشته

۵

\bPython\b

تطابق با "پایتون" در مرز کلمه

۶

\brub\B

\B یک مرز غیرکلمه‌ای است: تطابق با "روب" در "روبه" و "روبی" اما نه به تنهایی

۷

Python(?=!)

تطابق با "پایتون"، اگر دنبال آن علامت تعجب قرار داشته باشد

۸

Python(?!!)

تطابق با "پایتون"، اگر دنبال آن علامت تعجب نباشد

نحوی ویژه با پرانتزها

شماره نمونه و توضیحات
۱

R(?#comment)

تطابق با "R". بقیه به عنوان یک comment در نظر گرفته می‌شود

۲

R(?i)uby

تطابق بر اساس حروف کوچک و بزرگ در حین مطابقت با "uby"

۳

R(?i:uby)

همانند مورد قبلی

۴

rub(?:y|le))

فقط گروه بدون ایجاد بازگشتی \1