Python RegEx

RegEx یا Regular Expression یا همان عبارات با قاعده (منظم)، دنباله‌ای از کاراکترها هستند که یک الگوی جستجو را شکل می‌دهند.

با استفاده از RegEx می‌توان در یک رشته جهت بررسی وجود یا عدم وجود یک الگو به جستجو پرداخت.

مدول RegEx

همراه با پایتون یک پکیج به اسم re وجود دارد که امکان کار کردن با عبارت‌های با قاعده را برای ما فراهم می‌کند.

بعد از وارد کردن این مدول می‌توانیم کار کردن با عبارت با قاعده را شروع کنیم. برای نمونه در کد زیر جستجو می‌کنیم که آیا رشته با 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")

خروجی:

توابع RegEx

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

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

متا کاراکترها

Metacharacters کاراکترهایی با یک معنی خاص هسنند.

کاراکتر توضیح مثال
[] مجموعه‌ای از کاراکترها "[a-m]"
\ اعلام یک توالی خاص (همچنین برای فرار کاراکترهای خاص به کار می‌رود) "d\"
. هر کاراکتری به جز کاراکتر خط جدید "he..o"
^ شروع شود با "hello^"
$ پایان یافتن با "$planet"
* صفر یا تعداد مرتبه بیشتری رخ داده باشد "he.*o"
+ یک یا تعداد مرتبه بیشتری رخ داده باشد "he.+o"
? صفر یا یک مرتبه رخ داده باشد "he.?o"
{} دقیقاً به اندازه مشخص شده رخ داده باشد "he.{2}o"
| هر یک از "falls|stays"
() دسته بندی کردن

دنباله‌های خاص

دنباله خاص دنباله‌ای است که با \ شروع و با یکی از کاراکترهای جدول زیر ادامه می‌یابد و دارای معنی خاصی است.

کاراکتر توضیح
\A در صورتی که کاراکترهای مشخص شده در اول رشته باشند آن را به عنوان موردمنطبق برمی‌گرداند. "AThe\"
\b در صورتی که کاراکترهای مشخص شده در ابتدا و یا انتهای رشته موجود باشند، آن را به عنوان مورد منطبق برمی‌گرداند.
"r" در ابتدا باعث می‌شود مطمئن شویم رشته به صورت "raw string" بررسی می‌شود.
"r"\bain
"r"ain\b
\B در صورتی که کاراکترهای مشخص شده در رشته وجود داشته ولی در ابتدا و یا انتهای رشته نباشند، آن را به عنوان مورد منطبق برمی‌گرداند.
"r" در ابتدا باعث می‌شود مطمئن شویم رشته به صورت "raw string" بررسی می‌شود.
"r"\Bain
"r"ain\B
\d هر گاه رشته دارای رقم (اعداد از صفر تا 9) باشد، آن را به عنوان مورد منطبق برمی‌گرداند. "d\"
\D هر گاه رشته دارای رقم نباشد، آن را به عنوان مورد منطبق برمی‌گرداند. "D\"
\s هرگاه رشته دارای کاراکتر فاصله (white space character) باشد، آن رابه عنوان مورد منطبق برمی‌گرداند. "s\"
\S هرگاه رشته دارای کاراکتر فاصله (white space character) نباشد، آن رابه عنوان مورد منطبق برمی‌گرداند. "S\"
\w هرگاه رشته دارای هر کاراکتری از a تا Z، از صفر تا 9 و یا علامت زیرخط باشد، به عنوان مورد منطبق برگردانده می‌شود. "w\"
\W هرگاه رشته دارای هیچ کاراکتری از a تا Z، از صفر تا 9 و یا علامت زیرخط نباشد، به عنوان مورد منطبق برگردانده می‌شود. "W\"
\Z اگر کاراکترهای مشخص شده در انتهای رشته باشند، آن را به عنوان مورد منطبق برمی‌گرداند. "Spain\Z"

مجموعه‌ها

منظور از مجموعه در اینجا، مجموعه‌ای از کاراکترها داخل علامت کروشه با یک معنی خاص است.

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

تابع ()findall

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


import re

#Return a list containing every occurrence of "ai":

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

خروجی:

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

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


import re

txt = "The rain in Spain"

#Check if "Portugal" is in the string:

x = re.findall("Portugal", txt)
print(x)

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

خروجی:

تابع ()search

تابع search() در رشته به دنبال یک مورد منطبق می‌گردد و در صورت پیدا کردن آن یک Match object را برمی‌گرداند.

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


import re

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

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

خروجی:

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


import re

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

خروجی:

تابع ()split

تابع split() لیستی را برمی‌گرداند که در آن رشته در هر جا که مورد منطیق وجود دارد از هم جدا شده است.


import re

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


خروجی:

می‌توانید حداکثر تعداد مرتبه‌هایی که انطباق رخ می‌دهد را توسط تعیین پارامتر maxsplit کنترل کنید.


import re

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

خروجی:

تابع ()sub

تابع sub() موارد منطبق در رشته را با متن مورد نظر شما جایگزین می‌کند. برای نمونه در کد زیر تمامی فاصله‌ها را با عدد 9 جایگزین کرده‌ایم.


import re

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

خروجی:

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


import re

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

خروجی:

شیء ()match

شیء Match شیء است حاوی اطلاعاتی درباره جستجو و نتیجه.

اگر مورد منطبقی وجود نداشته باشد، به جای شیء Match مقدار None برگردانده می‌شود.

import re

txt = "The rain in Spain"
x = re.search("ai", txt)
print(x) #this will print an object

خروجی:

شیء Match دارای خصوصیات و توابع شیء است که با استفاده از آن‌ها می‌توان اطلاعاتی در مورد جستجو و نتیجه به دست آورد.

  • span(): یک تاپل شامل مکان‌های شروع و پایان مورد منطبق را برمی‌گرداند.
  • string(): رشته داده شده به تابع را برمی‌گرداند.
  • group(): قسمتی از رشته که در آنجا مطابقت وجود دارد را برمی‌گرداند.

import re

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

خروجی:


import re

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

خروجی:


import re

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

خروجی: