در قسمت قبل در رابطه با عبارات با قاعده یا Regular Expression در پایتون و کاراکترهای ویژه ی آن صحبت کردیم. در این قسمت نوبت به استفاده ی عملی از آن در توابع جست و جوی پایتون رسیده است. اگر قسمت قبل را مطالعه نکرده اید مطمئن باشید چیز زیادی از این قسمت دستگیرتان نخواهد شد بنابراین حتما قسمت قبل را مرور بفرمایید.
حالا باید با استفاده از دانش 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
است که بر اساس الگوی دریافتی رشته ی مورد نظر ما را جست و جو می کند و اگر نتیجه ای پیدا کرد یک 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 است.
این متد بر اساس الگوی دریافتی در یک رشته جست و جو می کند و هر جا که نتیجه (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']
این تابع بسیار کاربردی است و نتیجه ها را با متن دلخواه شما جایگزین می کند. به طور مثال در کد زیر هر جایی که اسپیس استفاده شده باشد را با عدد 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 مقدار 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 در پایتون پیدا کرده باشید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.