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

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

آشنایی با متدهای جست و جو در پایتون

در قسمت قبل در رابطه با عبارات با قاعده یا Regular Expression در پایتون و کاراکترهای ویژه ی آن صحبت کردیم. در این قسمت نوبت به استفاده ی عملی از آن در توابع جست و جوی پایتون رسیده است. اگر قسمت قبل را مطالعه نکرده اید مطمئن باشید چیز زیادی از این قسمت دستگیرتان نخواهد شد بنابراین حتما قسمت قبل را مرور بفرمایید.

متد ()findall

حالا باید با استفاده از دانش RegEx از توابع معرفی شده استفاده کنیم. اکثر این توابع کار خاصی به جز جست و جو بر اساس موارد جلسه ی قبل نمی کنند، بنابراین اکثر توضیحات این جلسه را در قالب مثال بیان خواهم کرد. اگر یادتان باشد اولین متد معرفی شده در جدول جلسه ی قبل ()findall بود که استفاده از آن بسیار ساده است:

import re

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

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

خروجی:

['ai', 'ai']

کد بالا تمام نتایج جست و جو را به ما برمی گرداند و از آنجایی که ai هم در rain و هم در spain موجود است نتیجه ی برگشت داده شده دو ai است. اگر جست و جوی ما هیچ نتیجه ای نداشته باشد یک آرایه ی خالی برمی گردد:

import re

str = "The rain in Spain"

#Check if "Portugal" is in the string:

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

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

خروجی:

[]
No match

متد ()search

متد بعدی، متد ()search است که بر اساس الگوی دریافتی رشته ی مورد نظر ما را جست و جو می کند و اگر نتیجه ای پیدا کرد یک Match object (شیء نتیجه) را برمی گرداند. توجه داشته باشید که اگر بیشتر از یک نتیجه در رشته پیدا شود این تابع فقط نتیجه ی اول را برمی گرداند و برای دریافت تمام نتایج باید از همان ()findall استفاده کنید. به طور مثال در کد زیر به دنبال اولین فضای خالی (اسپیس) در رشته می گردیم:

import re

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

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

خروجی:

The first white-space character is located in position: 3

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

import re

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

خروجی عبارت None است.

متد ()split

این متد بر اساس الگوی دریافتی در یک رشته جست و جو می کند و هر جا که نتیجه (match) ای پیدا کند رشته را از آن قسمت قطع می کند. در نهایت تمام این قسمت های قطع شده را به صورت یک لیست (list) به شما می دهد. توجه داشته باشید که منظور من از لیست نوع داده ی list است نه یک مجموعه به طور کلی. در مثال زیر گفته ایم که به دنبال فضای خالی (اسپیس) بگرد و طبیعتا هر جا اسپیس پیدا شود رشته قطع خواهد شد:

import re

#Split the string at every white-space character:

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

خروجی:

['The', 'rain', 'in', 'Spain']

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

import re

#Split the string at the first white-space character:

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

خروجی:

['The', 'rain in Spain']

تابع ()sub

این تابع بسیار کاربردی است و نتیجه ها را با متن دلخواه شما جایگزین می کند. به طور مثال در کد زیر هر جایی که اسپیس استفاده شده باشد را با عدد 9 تغییر داده ایم:

import re

#Replace all white-space characters with the digit "9":

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

خروجی:

The9rain9in9Spain

این تابع نیز مانند تابع قبل یک پارامتر دارد که تعداد دفعات جایگذاری و تعویض را محدود می کند. به طور مثال اگر برای مثال بالا محدودیت 2 موردی تعیین کنیم فقط دو مورد اول با 9 جایگزین می شوند:

import re

#Replace the first two occurrences of a white-space character with the digit 9:

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

خروجی:

The9rain9in Spain

Match Object (شیء نتیجه) چیست؟

Match Object شیء ای است که اطلاعاتی راجع به جست و جو و نتیجه ی آن را در خود نگه می دارد. توجه داشته باشید که در صورت نرسیدن به نتیجه، به جای شیء Match Object مقدار None برگردانده می شود:

import re

#The search() function returns a Match object:

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

خروجی ما چاپ شدن این شیء و محتویات آن است:

<_sre.SRE_Match object; span=(5, 7), match='ai'>

این شیء متدها و خصوصیات خود را دارد:

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

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

جست و جوی زیر به دنبال هر کلمه ای می گردد که با S بزرگ شروع شود. سپس موقعیت آن را پرینت می کند:

import re

#Search for an upper case "S" character in the beginning of a word, and print its position:

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

خروجی:

(12, 17)

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

import re

#The string property returns the search string:

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

خروجی:

The rain in Spain

و متد سوم برای دریافت نتیجه ی جست و جو می باشد:

import re

#Search for an upper case "S" character in the beginning of a word, and print the word:

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

خروجی Spain می باشد.

امیدوارم درک عمیق تری نسبت به عبارات با قاعده یا regular expression در پایتون پیدا کرده باشید.

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

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

حامد حاجوی
12 اردیبهشت 1399
سلام کلا مقاله ها خوب و مفید هستن. سپااااس

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