عبارات با قاعده در پایتون-عبارات منظم در پایتون-کتابخانه re در پایتون

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

regex مخفف عبارت Regular Experssion به معنی عبارت منظم یا با قاعده است. یک عبارت منظم دنباله‌ای از کاراکتر‌هاست که به عنوان یک الگوی جست و جو استفاده می‌شود.

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

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

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

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

import re

RegEx در پایتون

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

مثال زیر عباراتی را پیدا می‌کند که با “The” شروع و با “Spain” تمام می‌شود.

>>> import re
>>> txt = "The rain in Spain"
>>> x= re.search("^The.*Spain$", txt)
>>> print(x)
>>> if x :
...     print("YES! We have match!")
... else:
...     print("No match")
... 
YES! We have match!

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

تابع findall در پایتون

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

این تابع یک لیستی از الگوی دریافتی را بر می‌گرداند. اگر الگوی مد نظر(اولین آرگومان) موجود نباشد این تابع یک لیست خالی برمی‌گرداند. این تابع در مثال ریز تمامی ai ها را پیدا کرده و در لیست x ذخیره کرده است.

>>> import re
>>> txt = "The rain in Spain"
>>> x = re.findall("ai", txt)
>>> print(x)
['ai', 'ai']
>>> import re
>>> txt = "The rain in Spain"
>>> x = re.findall("Portual", txt)
>>> print(x)
[]

تابع search در پایتون

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

>>> import re
>>> x = re.search("ra",txt)
>>> print("The firs ra is located in postion:",x.start())
The firs ra is located in postion: 4
>>> import re
>>> txt = "The rain in Spain"
>>> x = re.search("ri",txt)
>>> print(x)
None

تابع slit در پایتون

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

>>> import re
>>> txt = "The rain in Spain"
>>> x = re.split("a", txt)
>>> print(x)
['The r', 'in in Sp', 'in']
>>> x = re.split(" ", txt)
>>> print(x)
['The', 'rain', 'in', 'Spain']

به مثال زیر که همراه با پارامتر سوم است دقت نمایید. با توجه به این که سومین پارامتر ۱ این تابع فقط یک بار رشته‌ی مورد نظر را تقسم کرده‌است.

>>> import re
['The', 'rain', 'in', 'Spain']
>>> x = re.split(" ", txt,1)
>>> print(x)
['The', 'rain in Spain']

تابع sub در پایتون

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

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

با استفاده از تابع sub کاراکترها space را با ۹ جایگزین کرده‌ایم.

>>> import re
>>> txt = "The rain in Spain"
>>> x = re.sub(" ", "9", txt)
>>> print(x)
The9rain9in9Spain

در مثال زیر کاراکتر جای خالی دوبار با ۹ جایگزین شده است.

>>> import re
>>> txt = "The rain in Spain"
>>> x = re.sub(" ", "9", txt,2)
>>> print(x)
The9rain9in Spain

شی Match در پایتون

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

اگر الگوی دریافتی در رشته‌ی مورد نظر پیدا نشود به جای شی Match مقدار None برگردانده می‌شود.

حاصل جست و جوی مثال زیر یک شی match است.

>>> import re
>>> txt = "The rain in Spain"
>>> x = re.search("ai",txt)
>>> print(x)
<re.Match object; span=(5, 7), match='ai'>

متغیر‌ها و متدهای تعریف شده در شی math اطلاعاتی در مورد جست و جو و نتیجه‌ی جست و جو ارایه می‌دهند.

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

متغیر string: این متغیر شامل رشته‌ای است که الگوی دریافتی در آن جست و جو شده است.

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

متد start: اندیس شروع الگوی مورد نظر در رشته‌ی دریافتی را نمایش می‌دهد.

متد end: اندیس پایان الگوی مورد نظر در رشته‌ی دریافتی را نمایش می‌دهد.

>>> import re
>>> txt = "The rain in Spain"
>>> x = re.search("ai",txt)
>>> print(x)
<re.Match object; span=(5, 7), match='ai'>
>>> print(x.span())
(۵, ۷)
>>> print(x.string)
The rain in Spain
>>> print(x.group())
ai
>>> print(x.start())
۵
>>> print(x.end())
۷

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

متا کاراکترها در عبارات منظم

کاراکترهایی که معنی و نقش خاصی در عبارات منظم ایفا می‌کنند متا کاراکتر نامیده می‌شوند.

متا کاراکتر []

کاراکترهایی که بین دو کاراکتر [ , ] قرار گیرند نمایش دهنده‌ی مجموعه‌ای از کاراکترهای مجاز در عبارات با قاعده هستند. به مثال‌های زیر دقت نمایید.
در تکه کد زیر پارامتر اول تابع findall یعنی “[a-m]” بیان کننده‌ی تمامی کاراکترهای مابین کاراکتر a و کاراکتر m است. لذا تابع findall تمامی کاراکترهایی که بین این دو کاراکتر هستند را در متن txt یافته و در یک لیست قرار می‌دهد.

>>> import re
>>> txt = "The rain in Spain"
>>> x = re.findall("[a-m]",txt)
>>> print(x)
['h', 'e', 'a', 'i', 'i', 'a', 'i']

متاکاراکتر \

این کاراکتر در عبارات منظم نشان دهنده‌ی یک توالی خاص از یک کاراکتر یا دسته‌ای از کاراکترهاست. با استفاده از این کاراکتر می‌توانید یک کاراکتر مخصوص را معرفی نمایید. به این صورت که کاراکتری که بعد از این کاراکتر آمده باشد به عنوان یک کاراکتر مخصوص در نظر گرفته می‌شد. در مثال زیر کاراکتر d (کاراکترهای مخصوص در اینجا به صورت کامل توضیح داده شده است.)که بعد از کاراکتر/ آمده است مشخص کننده‌ی اعداد است.
مثال زیر تمامی اعداد را در متن یافته و در یک لیست بر می‌گرداند.

>>> import re
>>> txt = "That will be 59 dollars"
>>> x = re.findall("\d", txt)
>>> print(x)
['۵', '۹']

متا کاراکتر .

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

>>> import re
>>> txt = "hello planet"
>>> x = re. findall("he..o", txt)
>>> print(x)
['hello']

متا کاراکتر ^

کاراکتر ^ شروع یک عبارت را مشخص می‌کند. در مثال زیر اگر عبارت مورد نظر با hello شروع شود تابع findall یک لیست شامل یک رشته بر می‌گرداند. با استفاده از این متا کاراکتر معمولا شروع شدن یک رشته با یک عبارت خاص را چی می‌کنند

>>> txtx = "hello planet"
>>> x = re.findall("^hello", txt)
>>> if x:
...     print("Yes, the string start with 'hello'")
... else:
...     print("No match")
... 
Yes, the string start with 'hello'

متا کاراکتر $

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

>>> import re
>>> txt = "helloo planet"
>>> x = re.findall("planet$", txt)
>>> if x:
...     print("Yes, the string end with 'planet'")
... else:
...     print("No match")
... 
Yes, the string end with 'planet'

متاکاراکتر *

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

متا کاراکترهای معمولا با هم ترکیب می‌شوند. و وقتی با هم ترکیب می‌شوند قدرت واقعی عبارات منظم نماین می‌شود

در مثال زیر he.*o نشان دهنده‌ی عبارتی است که با he شروع می‌شود و به دنبال آن حتما باید یک کاراکتر دلخواه باشد و پس از آن می‌تواند به تعداد دلخواه هر کاراکتری بیاید و یا بلافاصله o بیاید. به مثال‌های زیر توجه نمایید.

>>> txt = "hello planet"
>>> x = re.findall("he.*o", txt)
>>> print(x)
['hello']

در مثال زیر عبارت منظم he.*o شامل کلمه‌ی بی مفهوم ho نمی‌شود چون o بلافاصله بعد از h آمده است.

>>> txt = "ho hello"
>>> x = re.findall("he.*o", txt)
>>> print(x)
['hello']

متاکاراکتر+

این متا کاراکتر در پایتون نشان دهنده‌ی یک یا بیش از یک کاراکتر دلخواه است.he.+o نشان دهنده‌ی عباراتی است که با he شروع شده و بعد از آن یک کاراکتر دلخواه دارد و پس از این کاراکتر دلخواه یک یا بیش از یک کاراکتر دلخواه آمده و با o تمام شده است.

>>> txt = "hello planet"
>>> x = re.findall("he.+o", txt)
>>> 
>>> print(x)
['hello']

متا کاراکتر ?

متا کاراکتر ؟ نشان دهنده‌ی یک یا صفر کاراکتر دلخواه است. hel.?o نشان دهنده‌ی عباراتی است که با he شروع شده و با توجه به اینکه بعد از he یک . آمده است بعد از he حتما باید یک کاراکتر دلخواه بیاید و بعد از این کاراکتر دلخواه متاکاراکتر ? نشان دهنده‌ی صفر یا یک کاراکتر دلخواه است. لذا

>>> import re
>>> 
>>> txt = "hello planet"
>>> x = re.findall("he.?o", txt)
>>> 
>>> print(x)
[]

متاکاراکتر {}

بین { و } یک عدد صحیح قرار می‌گیرید و تعداد کاراکترهای دلخواه را نمایش می‌دهد. در مثال زیر “he.{2}o” نشان دهنده‌ی عباراتی است که با he شروع شده و بعد از آن دقیقا یک کاراکتر دلخواه آمده است و سپس دقیقا ۲ کاراکتر دلخواه قرار گرفته و به o ختم شده است.

>>> import re
>>> txt = "hello planet"
>>> x = re.findall("he.{2}o", txt)
>>> print(x)
['hello']

متا کاراکتر |

متا کاراکتر | مفهوم or را دارد و بین دو عبارت قرار می‌گیرد و نشان دهنده‌ی یکی از دو عبارت است. به مثال زیر توجه نمایید.

>>> import re
>>> txt = "The rain in Spain falls mainly in the plain!"
>>> x = re.findall("falls|stays", txt)
>>> print(x)
['falls']
>>> if x:
...   print("Yes, there is at least one match!")
... else:
...   print("No match")
... 
Yes, there is at least one match!

در این مثال اگر یکی از دو عبارت falls و stays در رشته‌ی مورد نظر ما وجود داشته باشد تابع findall یک لیست حاوی عبارت موجود بر می‌گرداند در غیر این صورت یک لیست خالی برمی‌گرداند.

متا کاراکتر ()

از کاراکترهای ( و ) برای دسته بندی و گروه بندی عبارات منظم استفاده می‌شود

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

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

دنباله‌ی \A

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

در تکه کد زیر اگر رشته‌ی دریافتی در دومین آرگومان تابع findall با The شروع شود این تابع یک لیست شامل The بر می‌گرداند در غیر این صورت یک رشته‌ی خالی برمی‌گرداند.

>>> import re
>>> txt = "The rain in Spain"
>>> x = re.findall("\AThe", txt)
>>> if x:
...     print("Yes, there is a match!")
... else:
...     print("No match")
... 
Yes, there is a match!

دنباله‌ی \b

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

در مثال زیر اگر عبارت in در ابتدای یکی از کلمات رشته‌ی txt آمده باشد تابع findall یک لیست حاوی رشته‌ی in برمی‌گرداند در غیر این صورت یک لیست خالی برمی‌گرداند.

>>> import re
>>> txt = "The rain in Spain"
>>> x = re.findall(r"\bin",txt)
>>> print(x)
['in']
>>> if x:
...     print(x)
... else:
...     priint('no match')
... 
['in']

در تکه کد زیر اگر رشته‌ی txt شامل عبارت ain یعنی عبارتی که قبل از \b آمده است باشد تابع findall یک لیست حاوی رخدادهای ain برمی‌گرداند در غیر اینصورت یک لیست خالی برمی‌گرداند.

>>> import re
>>> txt = "The rain in Spain"
>>> x = re.findall(r"ain\b", txt)
>>> print(x)
['ain', 'ain']

دنباله \B

این دنباله رخدادهای کاراکترهای بعد از B را که نه در ابتدا/نه در انتهای رشته باشد را مشخص می‌کند. این دنباله نیز همانند دنباله‌ی \b در دو موقعیت یعنی ابتدا و انتهای عبارت منظم استفاده می‌شود اگر در ابتدای عبارت منظم باشد تمامی عبارت متناظر با کاراکترهای بعد از B را پیدا می‌کند به شرطی که در ابتدای کلمه نباشد را پیدا می‌کند.

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

>>> import re
>>> txt = "The rain Spain"
>>> x = re.findall(r"\Bain", txt)
>>> print(x)
['ain', 'ain']

تکه کد زیر تمامی رخدادهای ain را که در انتهای یک کلمه نباشد پیدا می‌کند. اگر موردی نباشد یک رشته‌ی خالی برمی‌گرداند.

>>> import re
>>> tet = "The rain Spain"
>>> x = re.findall(r"\Bain", txt)
>>> print(x)
['ain', 'ain']
>>> import re
>>> txt = "The rain in Spain"
>>> x = re.findall(r"ain\B",txt)
>>> print(x)
[]

دنباله‌ \d

این دنباله در عبارات منظم مشخص کننده‌ی اعداد ۰ تا ۹ است.

در تکه کد زیر با استفاده از تابع findall وجود اعداد در رشته‌ی txt را چک کرده‌ایم. در صورتی که عددی در رشته‌ی مورد نظر وجود داشته باشد تابع یک لیست حاوی تمامی رخدادهای بر می‌گرداند در غیر این صورت یک لیست خالی بر‌می‌گرداند.

>>> import re
>>> txt = "The rain in Spain"
>>> x = re.findall("\d",txt)
>>> print(x)
[]
>>> txt = "The rain in Spain 999 ddfdf5555"
>>> x = re.findall("\d",txt)
>>> print(x)
['۹', '۹', '۹', '۵', '۵', '۵', '۵']

دنباله‌ی \D

این دنباله تطبیق‌هایی را برمی‌گرداند که عددی نیستند. تکه کد زیر با استفاده از این دنباله و تابع findall قسمت‌هایی از رشته‌ی txt که غیر عدد هستند را برمی‌گرداند. در واقع با استفاده از این دنباله می‌توان از وجود کاراکترهای غیر عددی مطمئن شد.

>>> import re
>>> txt = "Thea rain in Spain"
>>> x = re.findall("\D", txt)
>>> print(x)
['T', 'h', 'e', 'a', ' ', 'r', 'a', 'i', 'n', ' ', 'i', 'n', ' ', 'S', 'p', 'a', 'i', 'n']
>>> txt = "Thea rain in Spain 555555"
>>> x = re.findall("\D", txt)
>>> print(x)
['T', 'h', 'e', 'a', ' ', 'r', 'a', 'i', 'n', ' ', 'i', 'n', ' ', 'S', 'p', 'a', 'i', 'n', ' ']
>>> txt = "555555"
>>> x = re.findall("\D", txt)
>>> print(x)
[]

دنباله‌ی \s

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

>>> import re
>>> txt = "The rain in Spain"
>>> x = re.findall("\s", txt)
>>> print(x)
[' ', ' ', ' ']
>>> 

دنباله‌ی \S

این الگو تمامی تطبیق‌های را به جز space برمی‌گرداند. در صورتی که رشته از کاراکتر/کاراکترهای فضای خالی تشکیل یافته باشد یک لیست خالی بر‌میگرداند.

>>> import re
>>> txt = "The rain in Spain"
>>> x = re.findall("\S",txt)
>>> print(x)
['T', 'h', 'e', 'r', 'a', 'i', 'n', 'i', 'n', 'S', 'p', 'a', 'i', 'n']

دنباله‌ی \w

این دنباله کاراکترهای a تا z، اعداد ۰ تا ۹ کاراکتر زیر خط(_) را برمی‌گرداند.

>>> import re
>>> txt = "The rain in Spain"
>>> x = re.findall("\w", txt)
>>> print(x)
['T', 'h', 'e', 'r', 'a', 'i', 'n', 'i', 'n', 'S', 'p', 'a', 'i', 'n']

دنباله \W

این دنباله دقیقا برعکس دنباله‌ی \w است. تمامی کاراکترهای غیر حرفی را بر می‌گرداند. در حقیقت اگر در رشته‌ی مورد جست و جو کاراکترهای غیر حرفی موجود باشد را بر می‌گرداند در غیر اینصورت نسبت به تابعی که از این دنباله استفاده می‌کند لیست خالی، None و … بر می‌گرداند.تکه کد زیر تمامی کاراکترهای space را در یک رشته برمی‌گرداند.

>>> txt = "The rain in Spain"
>>> x = re.findall("\W", txt)
>>> print(x)
[' ', ' ', ' ']

دنباله \Z

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

>>> import re
>>> txt = "The rain in Spain"
>>> x = re.findall("Spain\Z", txt)
>>> print(x)
['Spain']

منبع:‌ w3schools

Be the first to write a review

Leave a comment