به آموزشگاه مجازی سینا خوش آمدید!

آموزش عبارت منظم(RegEx) در پایتون

امتیاز
(0)

RegEx مخفف Regular Expression به معنی عبارت منظم است. عبارت منظم به دنباله‌ای از کاراکترها گفته می‌شود که یک الگوی جستجو(search pattern) را تشکیل می‌دهند. یعنی به وسیله‌ی عبارت منظم می‌توانیم به جستجوی یک عبارت یا الگوی خاص در یک متن بپردازیم. 


ماژول RegEx در پایتون

پایتون یک پکیج یا ماژول داخلی به نام re دارد که می‌توانیم از آن برای کار با عبارات منظم استفاده کنیم. 

ایمپورت کردن ماژول re:

import re

عبارت منظم یا RegEx در پایتون

وقتی که ماژول re را در پایتون ایمپورت کردیم، می‌توانیم شروع به استفاده از عبارت‌های منظم کنیم:

مثال شماره 1

در این مثال، در یک رشته به جستجو می پردازیم تا ببینیم که آیا با عبارت "The" شروع می‌شود و با عبارت "Spain" پایان می یابد یا خیر:

import re

# پایان می یابد یا خیر Spain شروع می شود و با The بررسی اینکه آیا یک رشته با

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!
امتحان کنید

تابع‌های مربوط به عبارت منظم در ماژول re

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

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

 


کاراکترهای متا(Metacharacters) در عبارات منظم پایتون

کاراکترهای متا در پایتون، حروفی هستند که هرکدام یک معنی خاص دارد:

کاراکتر متا توضیحات مثال تست
[ ] یک مجموعه از کاراکترها را مشخص می‌کند. "[a-m]" امتحان کنید
\

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

"\d" امتحان کنید
.

اگر از این کاراکتر استفاده کنیم، به جای آن، می تواند هر کاراکتری قرار گیرد(به جز کاراکتر newline یا خط جدید). مثال روبه رو بررسی می‌کند که در رشته‌ی hello planet آیا یک کلمه به صورت he..o وجود دارد یا خیر. یعنی آیا یک کلمه در این رشته وجود دارد که با he شروع شود و پس از آن، دو حرف وجود داشته باشند (که به جای آنها هر کاراکتری می‌تواند باشد) و پس از آن یک حرف o قرار داشته باشد، یا خیر. 

"he..o" امتحان کنید
^

با استفاده از این کاراکتر، می‌توانیم بررسی کنیم که آیا یک رشته، مثلا با کلمه‌ی hello شروع شده است یا خیر. برای دیدن مثال، به لینک امتحان کنیدِ روبه رو مراجعه کنید. 

"^hello" امتحان کنید
$

با استفاده از این کاراکتر، می‌توانیم بررسی کنیم که یک رشته، مثلا با کلمه‌ی planet پایان یافته است یا خیر. 

"planet$" امتحان کنید
*

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

"he.*o" امتحان کنید
+

با استفاده از این کاراکتر، می‌توانیم بررسی کنیم که یک یا چند تطابق در یک رشته وجود داشته باشند. در مثال روبه‌رو بررسی می‌کنیم که آیا در یک رشته، کلمه‌ای وجود دارد که با he آغاز شود، و پس از آن (با کاراکتر متای نقطه) هر کاراکتری وجود داشته باشد و پس از آن (با کاراکتر متای +) یک یا چند حرف وجود داشته باشد که پس از آن یک کاراکتر o قرار داشته باشد. 

"he.+o" امتحان کنید
?

صفر یا یک تطابق: با استفاده از این کاراکتر، مشخص می‌کنیم که کاراکتر متای قبلی، 0 یا 1 بار تطابق داشته باشد. در مثال روبه‌رو، مشخص می کنیم که پس از he با استفاده از کاراکتر نقطه، فقط یک حرف قرار گیرد؛ اما با استفاده از کاراکتر متای ? مشخص می کنیم که این حرف یا نباید وجود داشته باشد( 0 تطابق داشته باشد) یا اگر وجود داشته باشد، فقط یک حرف تکی باشد(1 تطابق داشته باشد). در امتحان کنیدِ روبه‌رو کلمه‌ی hello مورد تطابق قرار نمی‌گیرد زیرا نه 0 و نه 1 کاراکتر، بلکه 2 کاراکتر بین he و o وجود دارد.

نکته: کاراکتر متای ? یک quantifier یا کمیت سنج محسوب می‌شود. 

"he.?o" امتحان کنید
{ }

تطابق، دقیقاً به تعداد مشخص شده: با استفاده از این کاراکتر، مشخص می‌کنیم که کاراکتر متای قبلی، به تعداد مشخص شده، تطابق داشته باشد. 

نکته: کاراکتر متای { } یک quantifier یا کمیت سنج محسوب می‌شود. 

"he.{2}o" امتحان کنید
|

یکی از دوتا: بررسی اینکه آیا یک رشته، حاوی یکی از دو مورد مشخص شده است یا خیر. 

"falls|stays" امتحان کنید
( ) برای گروه‌بندی کردن، از آن استفاده می‌شود.     

فلگ(Flag) در پایتون

وقتی که داریم از عبارت‌های منظم استفاده می‌کنیم، می‌توانیم فلگ‌هایی(flag یا پرچم) را به آنها اضافه کنیم.

فلگ مختصر فلگ توضیحات تست
re.ASCII re.A

تنها، تطابق‌های اَسکی(ASCII) را برمی‌گرداند. 

امتحان کنید
re.DEBUG  

اطلاعات دیباگ(debug) را برمی‌گرداند. 

امتحان کنید
re.DOTALL re.S

باعث می‌شود کاراکتر نقطه(.) با تمام کاراکترها تطابق داشته باشد(که شامل کاراکتر newline نیز می‌شود). 

امتحان کنید
re.IGNORECASE re.I

باعث می‌شود تطابق‌ها به حروف بزرگ و کوچک حساس نباشند(Case-insensitive).

امتحان کنید
re.MULTILINE re.M

باعث می‌شود تطابق‌ها در ابتدای(start/end)هریک از خطوط پیدا شوند. بدون استفاده از این فلگ، در "امتحان کنید" روبه‌، در مثال دوم، هیچ تطابقی پیدا نمی‌شود زیرا بدون re.MULTILINE تنها یک تطابق در ابتدای متن بررسی می‌شود.

امتحان کنید
re.NOFLAG  

مشخص می‌کند که هیچ فلگ‌ای برای این الگو(pattern) تنظیم نشده است. 

 
re.UNICODE re.U

تطابق‌های یونیکد(Unicode) را برمی‌گرداند. این از پایتون 3 به بعد، پیش‌فرض است. برای پایتون 2: از این فلگ استفاده کنید تا تنها تطابق‌های یونیکد را برگردانید. 

امتحان کنید
re.VERBOSE re.X

به ما امکان می‌دهد تا از فاصله‌های سفید(whitespaces) و کامنت‌ها در درون الگوها(pattern) استفاده کنیم. باعث می‌شود خوانایی الگو افزایش پیدا کند. 

امتحان کنید

توالی‌های ویژه (Special Sequences) در پایتون

یک توالیِ ویژه، درواقع یک علامت بک-اسلش(\) است که پس از آن، یکی از کاراکترهای درون لیست زیر قرار گیرد؛ و هرکدام یک معنی خاص دارد:

کاراکتر توضیحات مثال تست
\A

اگر کاراکترهای مشخص شده، در ابتدای یک رشته(string) قرار داشته باشند، یک تطابق را برمی‌گرداند. 

"\AThe" امتحان کنید
\b

اگر کاراکترهای مشخص شده، در ابتدا یا انتهای یک کلمه قرار داشته باشند، یک تطابق را برمی‌گرداند. 

حرف "r" در مثال روبه‌رو برای این است که اطمینان حاصل کنیم که حرف پس از بک‌اسلش یعنی b، به صورت یک رشته‌ی خام(raw string) تلقی شود. یعنی بعنوان کاراکتر گریز \b عمل نکند. 

در پایتون، یک رشته خام (raw string) رشته‌ای است که با استفاده از r مانند مثال روبه‌رو ایجاد می‌شود. در یک رشته خام، کاراکترهای \ به عنوان کاراکترهای لفظی یا حرفی در نظر گرفته می‌شوند، نه به عنوان کاراکترهای گریز مانند \n (خط جدید) یا \t (تب).

r"\bain"

r"ain\b"
امتحان کنید

امتحان کنید
\B

در جایی که کاراکترهای مشخص شده حضور دارند، یک تطابق را برمی‌گرداند، اما نه در ابتدا یا انتهای یک کلمه. 

حرف "r" در مثال روبه‌رو برای این است که اطمینان حاصل کنیم که حرف پس از بک‌اسلش یعنی B، به صورت یک رشته‌ی خام(raw string) تلقی شود. یعنی بعنوان کاراکتر گریز \b عمل نکند. 

r"\Bain"

r"ain\B"
امتحان کنید

امتحان کنید
\d

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

"\d" امتحان کنید
\D

در جایی که رشته‌ی مورد نظر حاوی رقم(digit) نیست، یک تطابق را برمی‌گرداند.

"\D" امتحان کنید
\s

در جایی که رشته‌ی مورد نظر حاوی یک فاصله‌ی سفید(white space) است، یک تطابق را برمی‌گرداند.

"\s" امتحان کنید
\S

در جایی که رشته‌ی مورد نظر حاوی یک فاصله‌ی سفید نیست، یک تطابق را برمی‌گرداند. 

"\S" امتحان کنید
\w

در جایی که رشته‌ی مورد نظر حاوی هر کاراکتر از کلمه(کاراکترها از a تا Z و رقم‌ها از 0 تا 9 و آندرلاین(کاراکتر _) باشد، یک تطابق را برمی‌گرداند.  

"\w" امتحان کنید
\W

در جایی که رشته‌ی مورد نظر حاوی هر کاراکتر کلمه نیست، یک تطابق را برمی‌گرداند. 

"\W" امتحان کنید
\Z

اگر کاراکترهای مشخص شده در انتهای رشته قرار داشته باشند، یک تطابق را برمی‌گرداند. 

"Spain\Z" امتحان کنید

دسته(set) در عبارات منظم پایتون

یک دسته(set)، در عبارات منظم، یک مجموعه از کاراکترها است که در درون براکت‌ها([ ]) قرار می‌گیرند و معنی خاصی دارند:

دسته(set) توضیحات امتحان کنید
[arn]

در جایی که یکی از کاراکترهای مشخص شده(a یا r یا n) حضور دارند، یک تطابق را برمی‌گرداند. 

امتحان کنید
[a-n]

برای هر کاراکتر با حروف کوچک، از نظر الفبایی بین a و n،  یک تطابق را برمی‌گرداند. 

امتحان کنید
[^arn]

برای هر کاراکتر، به جز a و r و n یک تطابق را برمی‌گرداند. 

امتحان کنید
[0123]

در جایی که هریک از رقم‌های مشخص شده(0 یا 1 یا 2 یا 3) حضور دارند، یک تطابق را برمی‌گرداند. 

امتحان کنید
[0-9]

برای هر رقم بین 0 و 9 یک تطابق را برمی‌گرداند. 

امتحان کنید
[0-5][0-9]

برای هریک از اعداد دورقمی از 00 تا 59، یک تطابق را برمی‌گرداند. 

امتحان کنید
[a-zA-Z]

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

امتحان کنید
[+]

در دسته‌ها(sets)، + و * و . و | و ( ) و $ و { } معنی خاصی ندارند(یعنی کار خاصی انجام نمی‌دهند)؛ بنابراین [+] یعنی: برای هر کاراکتر + در رشته، یک تطابق را برگردان. 

امتحان کنید

بررسی تابع findall()

تابع findall() یک لیست را برمی‌گرداند که حاوی تمام تطابق‌ها است. 

مثال شماره 2

پرینت کردن یک لیست از تمام تطابق‌ها:

import re

#است ai یک لیست را برمی گرداند که حاوی تمام تطابق های عبارت

txt = "The rain in Spain"
x = re.findall("ai", txt)
print(x)

نتیجه:

['ai', 'ai']
امتحان کنید

لیست مذکور حاوی تطابق‌ها، به همان ترتیبی که پیدا شده‌اند می‌باشد. اگر هیچ تطابقی پیدا نشود، یک لیست خالی برگردانده(return) می‌شود:

مثال شماره 3

برگرداندن یک لیست خالی، اگر هیچ تطابقی وجود نداشته باشد:

import re

txt = "The rain in Spain"

# در رشته ی مورد نظر وجود دارد یا خیر Portugal بررسی اینکه آیا عبارت
x = re.findall("Portugal", txt)
print(x)

if (x):
  print("Yes, there is at least one match!")
else:
  print("No match")

نتیجه:

[]
No match
امتحان کنید

بررسی تابع search() در پایتون

تابع search()، در رشته‌ی مورد نظر، به جستجوی یک تطابق می‌پردازد و اگر یک تطابق وجود داشته باشد، یک آبجکت تطابق(Match object) را برمی‌گرداند. اگر بیش از یک تطابق وجود داشته باشد، تنها اولین تطابقی که رخ داده است را برمی‌گرداند. 

مثال شماره 4

جستجو برای اولین کاراکتر فاصله‌ی سفید(white-space) در رشته‌ی مورد نظر:

import re

txt = "The rain in Spain"
x = re.search("\s", txt)

print("The first white-space character is located in position:", x.start()) 

نتیجه:

The first white-space character is located in position: 3
امتحان کنید

اگر هیچ تطابقی پیدا نشود، مقدار None برگردانده خواهد شد:

مثال شماره 5

انجام یک جستجو که هیچ تطابقی را برنمی‌گرداند:

import re

txt = "The rain in Spain"
x = re.search("Portugal", txt)
print(x)

نتیجه:

None
امتحان کنید

بررسی تابع split() در پایتون

تابع split() یک لیست را برمی‌گرداند، به طوری که رشته‌ی مورد نظر در آن برای هر تطابق شکسته(split) می‌شود:

مثال شماره 6

شکستن یا تقسیم کردن رشته، در هر کاراکتر فاصله‌ی سفید:

import re

#شکسته شدن رشته در هر کارکاتر فاصله ی سفید

txt = "The rain in Spain"
x = re.split("\s", txt)
print(x)

نتیجه:

['The', 'rain', 'in', 'Spain']
امتحان کنید

ما می‌توانیم تعداد رخدادها را با مشخص کردن پارامتر maxsplit کنترل کنیم:

مثال شماره 7

شکستن رشته، تنها در اولین رخداد:

import re

#شکستن رشته در اولین کاراکتر فاصله ی سفید

txt = "The rain in Spain"
x = re.split("\s", txt, 1)
print(x)

نتیجه:

['The', 'rain in Spain']
امتحان کنید

بررسی تابع sub() در پایتون

تابع sub() تطابق‌های درون یک متن را با آنچه که مشخص کنیم، جایگزین می‌کند. 

مثال شماره 8

جایگزین کردن هر فاصله ی سفید با عدد 9:

import re

#جایگزین کردن تمام کاراکترهای فاصله ی سفید با رقم 9

txt = "The rain in Spain"
x = re.sub("\s", "9", txt)
print(x)

نتیجه:

The9rain9in9Spain
امتحان کنید

ما می‌توانیم با مشخص کردن پارامتر count تعداد جایگزین‌ها را کنترل کنیم:

مثال شماره 9

جایگزین کردن اولین دو رخداد:

import re

#جایگزین کردن اولین دو رخداد، از فاصله ی سفید با رقم 9

txt = "The rain in Spain"
x = re.sub("\s", "9", txt, 2)
print(x)

نتیجه:

The9rain9in Spain
امتحان کنید

بررسی آبجکت تطابق(Match Object)

آبجکت تطابق، یک شیء است که حاوی اطلاعاتی درباره‌ی جستجو و نتیجه‌ی آن می باشد. 

نکته: اگر هیچ تطابقی وجود نداشته باشد، مقدار None به جای آبجکت تطابق برگردانده می‌شود. 

مثال شماره 10

انجام یک search که یک آبجکت تطابق را برمی‌گرداند:

import re

#یک آبجکت تطابق را برمی گرداند search تابع 

txt = "The rain in Spain"
x = re.search("ai", txt)
print(x)

نتیجه:

<_sre.SRE_Match object; span=(5, 7), match='ai'>
امتحان کنید

آبجکت تطابق، پروپرتی‌ها و متدهایی دارد که برای بازیابی اطلاعات مربوط به جستجو و نتیجه مورد استفاده قرار می‌گیرند. 

.span() یک تاپل را برمی‌گرداند که حاوی موقعیت‌های شروع و پایان یک تطابق است. 

.string رشته ای که به تابع مورد نظر پاس داده شده است را برمی‌گرداند. 

.group() آن بخشی از رشته که مورد تطابق قرار گرفته است را برمی‌گرداند. 

مثال شماره 11

موقعیت (شروع و پایان) اولین رخداد تطابق را پرینت می کند. 

این عبارت منظم به دنبال تمام کلماتی می‌گردد که با یک حرف بزرگ "S" شروع می‌شوند:

import re

#در ابتدای یک کلمه می گردد S به دنبال یک کاراکتر بزرگ 
#و موقعیت آن را پرینت می کند

txt = "The rain in Spain"
x = re.search(r"\bS\w+", txt)
print(x.span())

نتیجه:

(12, 17)
امتحان کنید

مثال شماره 12

پرینت کردن رشته ای که به تابع پاس داده شده است:

import re

#رشته ای که مورد جستجو قرار گرفته است را برمی گرداند string پروپرتی

txt = "The rain in Spain"
x = re.search(r"\bS\w+", txt)
print(x.string)

نتیجه:

The rain in Spain
امتحان کنید

مثال شماره 13

پرینت کردن بخشی از رشته که مورد تطابق قرار گرفته است. 
این عبارت منظم به دنبال هر کلمه ای می گردد که با یک حرف بزرگ S شروع می شود:

import re

#در ابتدای یک کلمه و پرینت کردن این کلمه S جستجو برای یک کاراکتر بزرگ

txt = "The rain in Spain"
x = re.search(r"\bS\w+", txt)
print(x.group())

نتیجه:

Spain
امتحان کنید

نکته: اگر هیچ تطابقی وجود نداشته باشد، مقدار None به جای آبجکت تطابق برگردانده خواهد شد. 

 


منبع: www.w3schools.com/python

 

  • بازدید: 107

نوشتن دیدگاه

لطفا نظرات خود را بیان کنید. به سوالات در سریع ترین زمان پاسخ داده خواهد شد.اما به نکات زیر توجه کنید:
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.

ارسال