آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

عبارات باقاعدهRegular expression/ در پایتون

دوره های مرتبط با این مقاله

تابع match

این تابع سعی می کند پارامتر pattern و string را با یکدیگر تطبیق دهد (پارامتر flags اختیاری می باشد).

در زیر دستور استفاده از این تابع را مشاهده می کنید:

re.match(pattern, string, flags=0)

جدول زیر پارامترهای ورودی این تابع را شرح می دهد:

پارامتر
شرح مورد کاربرد
pattern
پارامتر حاضر همان عبارت باقاعده یا الگویی است که باید تطبیق داده شود. در واقع توسعه دهنده سعی دارد مورد منطبق با این پارامتر را در متن پیدا کند.
string
این پارامتر رشته ای است که پارامتر فوق با بخش آغازین (اول) آن تطبیق داده می شود. در واقع تابع سعی دارد تا پارامتر اول را در پارامتر دوم که آن هم رشته است پیدا کند.
flags
می توانید با استفاده از عملگر بیتی OR (|)، flag های مختلف تعریف نمایید. این flag ها، modifier هایی هستند که در جدول زیر شرح داده می شوند.

تابع re.match در صورت یافتن مورد منطبق، در خروجی آبجکت match برمی گردانده و چنانچه مورد منطبقی یافت نشد، None مقدار خروجی خواهد بود. جهت یافتن و بازیابی عبارت منطبق در متن، توابع group(num) یا groups() از آبجکت match را فراخوانی می کنیم.

متدهای بررسی و یافتن مورد منطبق
شرح کاربرد
group(num=0)
این متد کل عبارت منطبق (match) را در خروجی برمی گرداند (یا یک زیرگروه معین که با توجه به پارامتر num مشخص می شود).
groups()
تمامی زیرگروه های منطبق موجود در یک چندتایی یا tuple را در خروجی برمی گرداند (در صورت عدم وجود مورد منطبق empty برمی گرداند).
مثال
#!/usr/bin/python
import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
   print "matchObj.group() : ", matchObj.group()
   print "matchObj.group(1) : ", matchObj.group(1)
   print "matchObj.group(2) : ", matchObj.group(2)
else:
   print "No match!!"

پس از اجرا گرفتن از کد فوق، خروجی زیر در نمایشگر درج می شود:

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

تابع search

این تابع اولین نمونه از مقدار پارامتر pattern که مورد منطبق با آن را داخل پارامتر string می یابد، به عنوان خروجی بازگردانی می نماید.

دستور نحوی استفاده از این تابع در زیر شرح داده شده است:

re.search(pattern, string, flags=0)

جدول زیر پارامترهای این متد را همراه با شرح کاربرد هریک شرح می دهد:

پارامتر
شرح
pattern
پارامتر جاری همان عبارت باقاعده ای است که با پارامتر دوم تطبیق داده می شود. در واقع این پارامتر با تمامی بخش های پارامتر دوم تطبیق داده می شود تا مورد منطبق یافت شود.
string
این پارامتر رشته ای است که تمامی بخش های آن با پارامتر اول تطبیق داده شده تا مورد منطبق یافت شود. در واقع متد مورد نظر در تمامی بخش های رشته ی دوم جستجو کرده و مورد منطبق را در خروجی بازیابی می کند.
flags
می توانید به وسیله ی OR (|)، عملگر بیتی، flag های متفاوت تعریف کنید.

در صورت یافتن مورد منطبق، تابع re.search یک آبجکت match در خروجی برمی گرداند و در غیر این صورت None را بازگردانی می نماید. با استفاده از توابع group(num) یا groups() می توان عبارات منطبق در رشته ی مورد نظر را استخراج و بازیابی نمود.

مقایسه ی دو متد Match و Search

پایتون جهت یافتن و استخراج مورد منطبق (الگو) در متن مورد نظر، دو عملیات پایه مبتنی بر عبارات باقاعده ارائه می دهد: 1. تطبیق الگو یا عبارت باقاعده با بخش اول پارامتر دوم (string) که توسط تابع match قابل پیاده سازی می باشد 2. تطبیق عبارات باقاعده و سعی بر یافتن مورد منطبق در کل پارامتر دوم (string) که توسط تابع search انجام می شود (زبان Perl در حالت پیش فرض عبارت باقاعده را با تمامی بخش های رشته تطبیق می دهد و در تمامی بخش های پارامتر دوم به دنبال مورد منطبق می گردد).

مثال
#!/usr/bin/python
import re
line = "Cats are smarter than dogs";
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
   print "match --> matchObj.group() : ", matchObj.group()
else:
   print "No match!!"
searchObj = re.search( r'dogs', line, re.M|re.I)
if searchObj:
   print "search --> searchObj.group() : ", searchObj.group()
else:
   print "Nothing found!!"

کد فوق پس از اجرا خروجی زیر را به دست می دهد:

No match!!
search --> matchObj.group() :  dogs

یافتن و جایگزینی مقدار در متن (search&replace)

یکی از مهم ترین متدهای ماژول re که عبارات باقاعده را به عنوان ورودی می گیرد، تابع sub می باشد.

دستور استفاده از متد

re.sub(pattern, repl, string, max=0)

این متد تمامی موارد منطبق با پارامتر pattern را با مقدار پارامتر repl جایگزین می کند. لازم به ذکر است که این متد تمامی موارد منطبق را جایگزین می کند مگر اینکه با مقداردهی پارامتر max بر آن محدودیت اعمال نمایید. خروجی تابع حاضر رشته ی ویرایش شده می باشد.

مثال
#!/usr/bin/python
import re
phone = "2004-959-559 # This is Phone Number"
# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print "Phone Num : ", num
# Remove anything other than digits
num = re.sub(r'\D', "", phone)    
print "Phone Num : ", num

کد حاضر خروجی زیر را برمی گرداند:

Phone Num :  2004-959-559
Phone Num :  2004959559

تنظیم و ویرایش عبارات باقاعده با استفاده از flag های اختیاری (Regular expression modifier)

literal ها یا مقادیر رشته ای محصور در تک کوتیشن که regular expression ها هستند را می توان به واسطه ی یک پارامتر اختیاری (optional flag/modifier) مطابق نیاز تنظیم کرده و عملیات انطباق و نیز استخراج مقدار مورد نظر از متن را به صورت اختصاصی انجام داد. modifier ها که به منظور تنظیم اختصاصی عملیات تطبیق و استخراج مقدار از آن استفاده می کنیم، در قالب پارامترهای اختیاری (optional flag) به متد مربوطه ارسال می شوند.

می توانید با استفاده از عملگر بیتی OR (|) چندین Modifier جهت تنظیم اختصاصی عملیات تطبیق تعریف نمایید.

تنظیم کننده ی عملیات انطباق / Modifier
شرح کاربرد
re.I
عملیات تطبیق و استخراج مقدار مورد نظر از متن را بدون حساسیت نشان دادن به کوچک و بزرگی حروف انجام می دهد(case insensitive-matching).
re.L
کلمات و واژگان را بر اساس زبان محلی (locale) تفسیر می کند.
re.M
سبب می شود $ با انتهای هر خطی (نه منحصرا یک رشته) تطبیق داده شده و نیز سبب می شود ^ با ابتدای هر خطی (نه صرفا رشته) تطبیق داده شود.
re.S
سبب می شود یک نقطه با هر کاراکتری، حتی کاراکتر newline قابل انطباق باشد.
re.U
حروف را بر اساس مجموعه کاراکترهای Unicode تفسیر می کند. این پارامتر رفتار \w، \W، \b و \B را تحت تاثیر قرار می دهد.
re.X
امکان تنظیم عبارات با قاعده ی خواناتری را فراهم می آورد. کاراکتر space را نادیده گرفته (مگر اینکه داخل [] بوده یا قبل از آن کاراکتر گریز \ درج شود)، همچنین کاراکتر # که قبل از آن هیچ کارکتر گریزی قرار نمی گیرد را به عنوان نشانگر comment و توضحیات در نظر می گیرد.

الگوها و مجموعه کاراکترهایی که جهت تطبیق در عبارات باقاعده بکار می روند (Regular Expression Patterns)

به استثنای کاراکترهای کنترلی، (+ ? . * ^ $ ( ) [ ] { } | \)، تمامی کاراکترها در فرایند تطبیق با خودشان منطبق اعلام می شوند. شما می توانید با درج کاراکتر backslash قبل از کاراکترهای کنترلی آن ها را نیز escape کرده و امکان تطبیق با خودشان را فراهم آورید.

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

الگوی بررسی تطبیق/عبارت باقاعده
شرح عملکرد
^
تنها با ابتدای خط قابل تطبیق می باشد.
$
فقط با انتهای خط، فعل تطبیق را انجام می دهد. در صورتی که کلمه ی منطبق در انتهای رشته، وجود داشته آن را یافته و برمی گرداند.
.
با تمامی کاراکترها به استثنای newline قابل تطبیق می باشد. با استفاده از پارامتر m به راحتی می توان امکان تطبیق آن با newline را نیز فراهم آورد.
[...]
با تمامی کاراکترهای موجود در [] تطبیق داده می شود.
[^...]
با تمامی کاراکترهای خارج از [] انطباق انجام می دهد.
re*
با 0 یا چندین نمونه از عبارت قبلی منطبق می شود.
re+
با 1 یا چندین نمونه از عبارت قبلی منطبق می شود.
re?
با 0 یا 1 نمونه از عبارت قبلی منطبق می شود.
re{ n}
چنانچه در عبارت قبلی n تا نمونه از عبارت قبلی وجود داشته باشد، با آن منطبق می شود.
re{ n,}
با nیا بیشتر نمونه از عبارت قبلی مچ می شود.
re{ n, m}
با حداقل n و حداکثر m نمونه از عبارت پیشین منطبق می شود.
a| b
در صورت وجود هر یک از دو کاراکتر a یا b انطباق رخ می دهد.
(re)
عبارات باقاعده را گروه بندی کرده و متن منطبق را به خاطر می آورد.
(?imx)
به طور موقت بین پارامترهای i، m یا x داخل عبارت باقاعده یا الگوی مورد نظر سویچ می کند (toggle). چنانچه در پرانتز قرار داشت، در آن صورت تنها آن ناحیه تحت تاثیر قرار می گیرد.
(?-imx)
به طور موقت بین پارامترهای i، m یا x داخل عبارت باقاعده سویچ می کند. داخل پرانتز، تنها ناحیه ی مربوطه تحت تاثیر قرار می گیرد.
(?: re)
عبارات باقاعده را بدون اینکه متن منطبق را به خاطر بیاورد، گروه بندی می کند.
(?imx: re)
به طور موقت بین پارامترهای i، m یا x داخل پرانتز سویچ (toggle) می کند.
(?-imx: re)
به طور موقت بین پارامترهای i، m یا x داخل پرانتز سویچ می کند.
(?#...)
Comment
(?= re)
موقعیت تطبیق متن را بر اساس الگوی اعلان شده، مشخص می نماید. بازه ی خاصی را مشخص نمی کند.
(?! re)
موقعیت تطبیق متن را باتوجه به نقیض الگو (pattern negation) مشخص می کند. بازه ی خاصی را مشخص نمی کند. (pattern negation زمانی که با استفاده از کاراکتر ?! انتظار می رود، الگو منطبق نباشد و نتیجه ی صحیح حاصل نشود)
(?> re)
Matches independent pattern without backtracking.
\w
چنانچه پارامترهای LOCALE و UNICODE استفاده نشده باشند، در آن صورت با تمامی کاراکترهای الفبایی-عددی منطبق می شود.
\W
در صورتی که پارامترهای LOCALE و UNICODE قید نشده باشند، با تمامی کاراکترهایی که الفبایی-عددی هستند منطبق می شود.
\s
با کاراکتر خط فاصله (whitespace) منطبق می شود. این الگو کارایی مشابه [\t\n\r\f] دارد.
\S
با مواردی که خط فاصله در آن وجود ندارد منطبق می شود.
\d
Matches digits. Equivalent to [0-9]. منحصرا با کاراکترهای عددی منطبق شده و معادل [0-9] می باشد.
\D
منحصرا با کاراکترهای غیرعددی تطبیق انجام داده و در صورت یافتن مورد منطبق آن را استخراج می کند.
\A
تنها با ابتدای یک رشته یا متن تطبیق انجام می دهد.
\Z
تنها با اتنهای رشته ی مورد نظر مچ شده و مورد منطبق در انتهای رشته را استخراج می کند.
\z
با انتهای رشته تطبیق انجام داده و مورد منطبق در انتهای رشته را بازگردانی می کند.
\G
Matches point where last match finished.
\b
Matches word boundaries when outside brackets. Matches backspace (0x08) when inside brackets.
زمانی که متن خارج از [] باشد، با اول یا انتهای کلمه منطبق می شود. اگر متن داخل [] باشد، با کاراکتر backspace منطبق می شود.
\B
Matches nonword boundaries.
اگر انتها یا ابتدای کلمه کاراکتری nonword باشد، با آن منطبق می شود.
\n, \t, etc.
با کاراکترهای newline، carriage return، tab و غیره ... منطبق می شود.
\1...\9
Matches nth grouped subexpression.
\10
Matches nth grouped subexpression if it matched already. Otherwise refers to the octal representation of a character code.

نمونه هایی از عبارات با قاعده

کاراکترهای ثابت (literal)

مثال
شرح
python
با واژه ی "python" منطبق می شود.

Character class (مجموعه کاراکترها)

به واسطه ی این امکان توسعه دهنده می تواند به موتور regex اعلان کند که از میان چندین کاراکتر، تنها یکی را استخراج کند.

مثال
شرح
[Pp]ython
با هر یک از دو واژگان "Python" یا "python" منطبق می شود.
rub[ye]
با هر یک از دو واژه ی "ruby" یا "rube" انطباق می یابد.
[aeiou]
با هر یک از پنج مصوت کوچک (lowercase vowel) منطبق می شود. به عبارت دیگر، یکی از حروف بین بازه ی فوق را انتخاب و استخراج می نماید.
[0-9]
با هر یک از اعداد (از 9 الی 0) منطبق می باشد.
[a-z]
با هر یک از حروف ASCII از a الی z منطبق می شود.
[A-Z]
هر یک از حروف ASCII بزرگ در متن مورد نظر موجود بود، انطباق انجام می گیرد.
[a-zA-Z0-9]
در صورت وجود a تا z یا A تا Z و نیز 0 تا 9 انطباق صورت می گیرد.
[^aeiou]
با هر یک از مصوت هایی که با حروف بزرگ نوشته می شوند، منطبق محسوب می شود.
[^0-9]
با تمامی کاراکترها، به استثنای اعداد، منطبق محسوب می شود.

Character class ها (مجموعه کاراکترها)

مثال
شرح
.
با هر کاراکتری به غیر از newline منطبق شده و آن را استخراج می کند.
\d
: [0-9]با کاراکترهای عددی منطبق شده و آن را استخراج می کند.
\D
: [^0-9] با کاراکترهای غیرعددی منطبق شده و آن ها را استخراج می کند.
\s
: [ \t\r\n\f]با کاراکتر فاصله (space) منطبق می شود.
\S
: [^ \t\r\n\f]با تمامی کاراکترهای غیر خط سفید (space) منطبق می شود. به عبارت دیگر هر چیزی به جز فاصله را استخراج می کند.
\w
از میان [A-Za-z0-9_] یکی را انتخاب کرده و استخراج می کند (با تنها یک کاراکتر word منطبق می شود).
\W
با تمامی کاراکترها به غیر از [^A-Za-z0-9_] منطبق می شود (با تنها یک کاراکتر nonword منطبق می شود).

Repetition Cases (مواردی که در آن چندبار انطباق رخ می دهد)

مثال
شرح
ruby?
با "rub" یا "ruby" منطبق شده و آن را استخراج می نماید: y اختیاری می باشد.
ruby*
کلمه ی "rub" را به همراه 0 یا بیشتر ys انتخاب کرده و استخراج می کند.
ruby+
با واژه ی "rub" به همراه 1 ys یا بیشتر منطبق شده و آن را استخراج می کند.
\d{3}
با دقیقا 3 عدد منطبق شده و آن ها را استخراج می نماید.
\d{3,}
با 3 یا بیشتر عدد منطبق شده و آن را استخراج می کند.
\d{3,5}
با 3، 4 یا 5 کاراکتر عددی منطبق شده و آن ها را استخراج می کند.

انطباق با کمترین تعداد مورد تکراری در رشته (nongreedy repetition)

با کمترین تعداد مورد تکراری (بخش قبلا یافته و استخراج شده) در رشته ی مورد نظر منطبق می شود:

مثال
شرح
<.*>
اگر رشته ی مورد نظر شما "" باشد (فقط این رشته خروجی دلخواه شما باشد) ، آنگاه از متن "perl>"، عبارت باقاعده ی جاری کل متن "perl>" را بازمی گرداند که در اصطلاح به آن greedy repetition می گویند.
<.*?>
فرض بگیرید رشته ی تستی شما به این شکل باشد: " perl>" . عبارت باقاعده ی جاری تنها با "" منطبق شده و آن را استخراج می کند.

مشخص کردن انتها و ابتدای موقعیت استخراج با پرانتز (Grouping)

مثال
شرح
\D\d+
No group: + repeats \d
(\D\d)+
Grouped: + repeats \D\d pair
([Pp]ython(, )?)+
با هر یک از رشته های "Python"، "Python, python, python" منطبق می باشد.

Backreferences (تطبیق مجدد و استفاده از بخش های یافته شده ی قبلی)

Backreferences (تطبیق مجدد و استخراج مورد منطبق قبلی) تطبیق و استخراج گروهی که قبلا انطباق با آن رخ داده را فراهم می آورد.

نمونه
شرح
([Pp])ython&\1ails
با هر یک از دو رشته ی python&pails یا Python&Pails منطبق شده و آن را استخراج می کند.
(['"])[^\1]*\1
با رشته ی تک کوتیشن یا دابل کوتیشن منطبق شده و آن را استخراج می کند. \1 با هر موردی که گروه اول با آن منطبق شد، مچ می شود. \2 نیز به همین ترتیب، با هر موردی که گروه اول با آن منطبق شده، مچ و در نهایت آن را استخراج می کند.

نمونه های دیگر از عبارات باقاعده

مثال
شرح
python|perl
با یکی از دو رشته ی "python" یا "perl" منطبق شده و آن را استخراج می کند.
rub(y|le))
"ruby" یا "ruble" را استخراج می کند.
Python(!+|\?)
با "Python" که در دنباله ی آن یک یا بیشتر ! و یا ? باشد، منطبق می شود.

Anchor ها در عبارات باقاعده

Anchor ها به کاراکتر خاصی اشاره نمی کنند، بلکه محل استخراج (match position) را مشخص کرده و به موقعیت انطباق اشاره می کنند.

مثال
شرح
^Python
با واژه ی "Python"، چنانچه در ابتدای رشته ی متنی یا خط قرار داشته باشد، منطبق شده و آن را استخراج می کند.
Python$
چنانچه کلمه ی "Python" در انتهای خط یا رشته بود، آن را استخراج کن.
\APython
در صورتی که واژه ی "Python" در ابتدای رشته باشد، با آن منطبق شده و واژه ی مذکور را استخراج می کند.
Python\Z
با واژه ی "Python"، زمانی که در انتهای رشته جای گرفته باشد، منطبق شده و آن را استخراج می کند.
\bPython\b
Match "Python" at a word boundary چنانچه "Python" در ابتدا یا انتهای متن مورد نظر بود، آن را استخراج می کند.
\brub\B
\B is nonword boundary: match "rub" in "rube" and "ruby" but not alone
Python(?=!)
با واژه ی"Python"، در صورتی که در دنباله ی آن علامت تعجب یا کاراکتر ! ذکر شده باشد، منطبق شده و آن را استخراج می کند.
Python(?!!)
با واژه ی "Python" منطبق شده و آن را استخراج می کند، به شرطی که در دنباله ی آن علامت تعجب وجود نداشته باشد.

ساختار نحوی ویژه با پرانتز

مثال
شرح
R(?#comment)
با "R" منطبق شده و آن را استخراج می کند. باقی آنچه مشاهده می کنید صرفا comment است.
R(?i)uby
عدم حساس بودن به کوچک یا بزرگی حروف به هنگام انطباق با "uby" و استخراج آن
R(?i:uby)
مشابه ی نمونه ی فوق
rub(?:y|le))
گروه بندی بدون پیاده سازی \1 انطباق با مورد قبلی و استفاده ی مجدد از آن یا به عبارت دیگر بدون ایجاد \1 backreference.
  • 5477
  •    6
  • تاریخ ارسال :   1396/02/17

دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

تمامی حقوق این سایت متعلق به آموزشگاه تحلیل داده می باشد .