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

4 سال پیش

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

در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، شما با عبارات با قاعده در برنامه نویسی پایتون (RegEx) آشنا خواهید شد و از ماژول re پایتون برای کار با RegEx (با کمک مثال ها) استفاده می کنید.

پیشنهاد ویژه : پکیج آموزش طراحی وب سایت با پایتون

عبارات با قاعده در برنامه نویسی پایتون RegEx) Regular Expression) یک توالی از کاراکترهاست که الگوی جستجو را تعریف می کند. مثلا،

^a...s$

کد فوق الگوی RegEx را تعریف می کند. الگو این است: هر رشته پنج حرفی که با a شروع می شود و با s پایان می یابد.

الگویی که با استفاده از RegEx تعریف شده است می تواند برای مطابقت با یک رشته استفاده شود.

عبارت

رشته

Matched?

^a…s$

abs

No matchNo match

alias

Match

abyss

Match

Alias

No match

An abacus

No match

 

پایتون یک ماژول به نام re برای کار با RegEx دارد. مثالی در اینجا آورده شده است:

pattern = '^a...s$'
test_string = 'abyss'
result = re.match(pattern, test_string)

if result:
  print("Search successful.")
else:
  print("Search unsuccessful.")

در اینجا ، ما از تابع ()re.match  برای جستجوی الگو در test_string استفاده کردیم. اگر جستجو موفقیت آمیز باشد، این روش یک شی match را برمی گرداند. در غیر این صورت،  Noneرا برمی گرداند.

چندین توابع دیگر نیز برای کار با RegEx در ماژول re تعریف شده است. قبل از بررسی این موضوع، بیایید در مورد عبارات با قاعده خود بدانیم.

 

مشخص کردن الگو با استفاده از RegEx 

برای تعیین عبارات با قاعده، از متا کاراکترها استفاده می شود. در مثال فوق، ^ و $ متا کاراکترها هستند.

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

متا کاراکترها، کاراکترهایی هستند که توسط موتور RegEx به روشی خاص تفسیر می شوند. در اینجا لیستی از متا کاراکترها موجود است:

[] ^ $ * +؟ {} () \ |

[] – کروشه

کروشه مجموعه ای از کاراکتر هایی را که می خواهید مطابقت داشته باشند را مشخص می کند.

رشته رشته Matched?

[abc]

a

۱ match

ac

۲ matches

Hey Jude

No match

abc de ca

۵ matches

اگر رشته ای که می خواهید مطابقت دهید حاوی هر یک از a ، b یا c است ، [abc] مطابقت خواهد داشت.

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

  • [a-e] همان [abcde] است.
  • [۱-۴] همان [۱۲۳۴] است.
  • [۰-۳۹] همان [۰۱۲۳۹] است.

می توانید کاراکتر تنظیم شده را با استفاده از نماد caret ^ در ابتدای یک کروشه تکمیل کنید (معکوس کنید).

  • [^ abc] به معنای هر کاراکتری است به جز a یا b یا c.
    [^ ۰-۹] به معنای هر کاراکتر غیر عددی است.

. – دوره

یک دوره با هر کاراکتر منفرد مطابقت دارد (به جز خط جدید “\ n”).

عبارت رشته Matched?
.. a No match
ac ۱ match
acd ۱ match
acde ۲ matches (contains 4 characters)

^ – Caret

از نماد ^caret  برای بررسی اینکه آیا یک رشته با یک کاراکتر خاص شروع می شود استفاده می شود.

عبارت رشته Matched?
^a a ۱ match
abc ۱ match
bac No match
^ab abc ۱ match
acb No match (starts with a but not followed by b)

 

$ – دلار

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

عبارت رشته Matched?
a$ a ۱ match
formula ۱ match
cab No match

* – ستاره

نماد ستاره * با صفر یا بیشتر از الگوی باقی مانده از آن مطابقت دارد.

عبارت رشته Matched?
ma*n mn ۱ match
man ۱ match
maaan ۱ match
main No match (a is not followed by n)
woman ۱ match

+ – جمع

نماد جمع + با یک یا چند مورد از الگوی باقی مانده مطابقت دارد.

عبارت رشته Matched?
ma+n mn No match (no a character)
man ۱ match
maaan ۱ match
main No match (a is not followed by n)
woman ۱ match

 

 

؟ – علامت سوال

نماد علامت سوال ؟ با صفر یا یک الگوی  باقی مانده مطابقت دارد.

عبارت رشته Matched?
ma?n mn ۱ match
man ۱ match
maaan No match (more than one a character)
main No match (a is not followed by n)
woman ۱ match

{} – آکولاد

این کد را در نظر بگیرید: {n، m}. این به معنای حداقل n و حداکثر m تکرار الگویی است که برای آن باقی مانده است.

عبارت رشته Matched?
a{2,3} abc dat No match
abc daat ۱ match (at daat)
aabc daaat ۲ matches (at aabc and daaat)
aabc daaaat ۲ matches (at aabc and daaaat)

 

بیایید یک مثال دیگر را امتحان کنیم. این {RegEx [0-9] {2، ۴ حداقل با ۲ رقم مطابقت دارد اما بیشتر از ۴ رقم نیست.

عبارت رشته Matched?
[۰-۹]{۲,۴} ab123csde ۱ match (match at ab123csde)
۱۲ and 345673 ۳ matches (12, 3456, 73)
۱ and 2 No match

 

| – تناوب

میله عمودی | برای تناوب استفاده می شود.

عبارت رشته Matched?
a|b cde No match
ade ۱ match (match at ade)
acdbea ۳ matches (at acdbea)

 

در اینجا ، a | b با هر رشته ای که شامل a یا b باشد مطابقت دارد.

 

() – گروه

از پرانتز () برای گروه بندی الگوهای فرعی استفاده می شود. به عنوان مثال ، a | b | c) xz) با هر رشته ای مطابقت دارد که با a یا b یا c و پس از آن xz مطابقت داشته باشد

عبارت رشته Matched?
(a|b|c)xz ab xz No match
abxz ۱ match (match at abxz)
axz cabxz ۲ matches (at axzbc cabxz)

\ – بک اسلش

Backlash \ برای فرار از کاراکترهای مختلف از جمله همه کاراکترهای متا استفاده می شود. مثلا،

اگر رشته ای شامل $ به دنبال آن باشد، \ $ مطابقت دارد. در اینجا ، $ توسط موتور RegEx به روشی خاص تفسیر نمی شود.

اگر مطمئن نیستید که یک کاراکتر معنی خاصی دارد یا نه، می توانید بک اسلش را مقابل آن قرار دهید. این باعث می شود که با کاراکتر به روشی خاص برخورد نشود.

 

توالی های خاص

توالی های خاص نوشتن الگوهای معمول را آسان می کند. در اینجا لیستی از توالی های خاص وجود دارد:

A\ – اگر کاراکتر های مشخص شده در ابتدای یک رشته قرار بگیرند، مطابقت دارد.

عبارت رشته Matched?
\Athe the sun Match
In the sun No match

 

b\ – در صورتی که کاراکتر های مشخص شده در ابتدا یا انتهای کلمه باشند، مطابقت دارد.

عبارت رشته Matched?
\bfoo football Match
a football Match
afootball No match
foo\b the foo Match
the afoo test Match
the afootest No match

 

B\ – مقابل b \. در صورتی که کاراکتر های مشخص شده در ابتدا یا انتهای کلمه نباشند، مطابقت دارد.

عبارت رشته Matched?
\Bfoo football No match
a football No match
afootball Match
foo\B the foo No match
the afoo test No match
the afootest Match

 

d\ – با هر رقم اعشاری مطابقت دارد. معادل [۰-۹]

عبارت رشته Matched?
\d ۱۲abc3 ۳ matches (at 12abc3)
Python No match

 

D \- با هر عدد غیر اعشاری مطابقت دارد. معادل [^ ۰-۹]

عبارت رشته Matched?
\D ۱ab34"50 ۳ matches (at 1ab34"50)
۱۳۴۵ No match

 

s \- مواردی که یک رشته شامل هر کاراکتر فضای خالی است. معادل [\ t \ n \ r \ f \ v].

عبارت رشته Matched?
\s Python RegEx ۱ match
PythonRegEx No match

 

S \ – مواردی که یک رشته شامل هر کاراکتر غیر فضای خالی است. معادل [^ \ t \ n \ r \ f \ v].

عبارت رشته Matched?
\S a b ۲ matches (at a b)
    No match

 

w \- با هر حرف الفبایی (رقم و حروف) مطابقت دارد. معادل [a-zA-Z0-9_]. به هر حال، زیرخط _ نیز یک کاراکتر عددی است.

عبارت رشته Matched?
\w ۱۲&": ;c ۳ matches (at 12&": ;c)
%"> ! No match

 

W\ – با هر کاراکتر غیر الفبایی مطابقت دارد. معادل [^ a-zA-Z0-9_]

عبارت رشته Matched?
\W ۱a2%c ۱ match (at 1a2%c)
Python No match

 

Z\ – در صورتی که کاراکتر های مشخص شده در انتهای یک رشته قرار داشته باشند، مطابقت دارد.

عبارت رشته Matched?
Python\Z I like Python ۱ match
I like Python Programming No match
Python is fun. No match

 

نکته: برای ساخت و آزمایش عبارات با قاعده، می توانید از ابزارهای تست RegEx مانند regex101 استفاده کنید. این ابزار نه تنها به شما در ایجاد عبارات با قاعده کمک می کند ، بلکه به شما در یادگیری آن نیز کمک می کند.

اکنون اصول RegEx را فهمیدید ، بیایید نحوه استفاده از RegEx را در کد پایتون خود بحث کنیم.

 

پایتون RegEx 

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

import re

ماژول چندین تابع و ثابت را برای کار با RegEx تعریف می کند.

()re.findall 

متد () re.findall لیستی از رشته ها را که شامل همه موارد منطبق است برمی گرداند.

مثال ۱: ()re.findall 

# Program to extract numbers from a string

import re

string = 'hello 12 hi 89. Howdy 34'
pattern = '\d+'

result = re.findall(pattern, string) 
print(result)

# Output: ['12', '89', '34']

اگر الگوی پیدا نشد، ()re.findall  لیست خالی را برمی گرداند.

 

()re.split 

متدre.split رشته ها را در جایی که تطبیق دارد تقسیم می کند و لیستی از رشته هایی را که تقسیمات در آنها رخ داده است را برمی گرداند.

مثال ۲: ()re.split 

import re

string = 'Twelve:12 Eighty nine:89.'
pattern = '\d+'

result = re.split(pattern, string) 
print(result)

# Output: ['Twelve:', ' Eighty nine:', '.']

اگر الگو پیدا نشد، ()re.split  لیستی را که شامل رشته اصلی است برمی گرداند.

می توانید آرگومان maxsplit را به متد () re.split منتقل کنید. این حداکثر تعداد تقسیم های است که رخ خواهد داد.

import re

string = 'Twelve:12 Eighty nine:89 Nine:9.'
pattern = '\d+'

# maxsplit = 1
# split only at the first occurrence
result = re.split(pattern, string, 1) 
print(result)

# Output: ['Twelve:', ' Eighty nine:89 Nine:9.']

ضمناً ، مقدار پیش فرض maxsplit برابر ۰ است. یعنی همه تقسیم های احتمالی که وجود دارد.

 ()re.sub

نحو ()re.sub به شرح زیر است:

re.sub(pattern, replace, string)

این متد رشته ای را برمی گرداند که در آن وقایع همسان با محتوای متغیر جایگزین می شوند.

 

مثال ۳: ()re.sub 

# Program to remove all whitespaces
import re

# multiline string
string = 'abc 12\
de 23 \n f45 6'

# matches all whitespace characters
pattern = '\s+'

# empty string
replace = ''

new_string = re.sub(pattern, replace, string) 
print(new_string)

# Output: abc12de23f456

اگر الگوی پیدا نشد، ()re.sub رشته اصلی را برمی گرداند.

می توانید count را به عنوان پارامتر چهارم به متد () re.sub منتقل کنید. اگر حذف شود، به ۰ می رسد. این جایگزین همه موارد می شود.

import re

# multiline string
string = 'abc 12\
de 23 \n f45 6'

# matches all whitespace characters
pattern = '\s+'
replace = ''

new_string = re.sub(r'\s+', replace, string, 1) 
print(new_string)

# Output:
# abc12de 23
# f45 6

 

 ()re.subn

()re.subn مشابه () re.sub است انتظار می رود یک گروه ۲ تایی شامل رشته جدید و تعداد تعویض های انجام شده را برگرداند.

 

مثال ۴: ()re.subn 

# Program to remove all whitespaces
import re

# multiline string
string = 'abc 12\
de 23 \n f45 6'

# matches all whitespace characters
pattern = '\s+'

# empty string
replace = ''

new_string = re.subn(pattern, replace, string) 
print(new_string)

# Output: ('abc12de23f456', 4)

 

()re.search 

متد  ()re.search  دو آرگومان می گیرد: یک الگو و یک رشته. این متد به دنبال اولین مکانی است که الگوی RegEx با رشته مطابقت دارد.

اگر جستجو موفقیت آمیز باشد، ()re.search یک شی match را برمی گرداند. در غیر این صورت، None را بر نمی گردد.

match = re.search(pattern, str)

 

مثال ۵: ()re.search

import re

string = "Python is fun"

# check if 'Python' is at the beginning
match = re.search('\APython', string)

if match:
  print("pattern found inside the string")
else:
  print("pattern not found")  

# Output: pattern found inside the string

 

Match object

با استفاده از تابع ()dir می توانید متدها و ویژگی های یک Match object را بدست آورید.

برخی از روشها و ویژگیهای متداول Match object منطبق عبارتند از:

 

()match.group

متد ()group بخشی از رشته را در جایی که مطابقت دارد برمی گرداند.

مثال ۶: Match object

import re

string = '39801 356, 2102 1111'

# Three digit number followed by space followed by two digit number
pattern = '(\d{3}) (\d{2})'

# match variable contains a Match object.
match = re.search(pattern, string) 

if match:
  print(match.group())
else:
  print("pattern not found")

# Output: 801 35

در اینجا ، متغیر مطابقت شامل یک Match object است.

الگوی ما (\ d {3}) (\ d {2}) دارای دو زیر گروه (\ d {3}) و (\ d {2}) است. می توانید بخشی از رشته این زیرگروههای پرانتزی را بدست آورید. نحوه کار:

>>> match.group(1)
'۸۰۱'

>>> match.group(2)
'۳۵'
>>> match.group(1, 2)
('۸۰۱', '۳۵')

>>> match.groups()
('۸۰۱', '۳۵')

 

 ()match.start () ، match.end () و match.span

تابع ()start  اندیس شروع زیر رشته همسان را برمی گرداند. به همین ترتیب، ()end  شاخص انتهایی زیر رشته همسان را برمی گرداند.

>>> match.start()
۲
>>> match.end()
۸

تابع()span  یک تاپل شامل اندیس شروع و پایان قسمت همسان را برمی گرداند.

>>> match.span()
(۲, ۸)

 

match.re و match.string

ویژگی re یک Match object، یک عبارت بیان منظم را برمی گرداند. به همین ترتیب، ویژگی string رشته عبور داده شده را برمی گرداند.

>>> match.re
re.compile('(\\d{3}) (\\d{2})')

>>> match.string
'۳۹۸۰۱ ۳۵۶, ۲۱۰۲ ۱۱۱۱'

 

استفاده از پیشوند r قبل از RegEx

وقتی پیشوند r یا R قبل از یک عبارت با قاعده استفاده می شود ، این به معنی رشته خام است. به عنوان مثال ، ‘\ n’ یک خط جدید است در حالی که r ‘\ n’ به معنای دو کاراکتر است: یک بک اسلش \ به دنبال n.

Backlash \ برای فرار از کاراکترهای مختلف از جمله همه کاراکترهای متا استفاده می شود. با این حال، استفاده از پیشوند r باعث می شود \ به عنوان یک کاراکتر معمولی رفتار کند.

 

مثال ۷: رشته خام با استفاده از پیشوند r

import re

string = '\n and \r are escape sequences.'

result = re.findall(r'[\n\r]', string) 
print(result)

# Output: ['\n', '\r']

 

منبع.

لیست جلسات قبل آموزش برنامه نویسی پایتون

  1. آموزش نصب و اجرای برنامه نویسی پایتون
  2. کلیدواژه ها و شناسه های برنامه نویسی پایتون
  3. دستورات، تورفتگی ها و کامنت ها در برنامه نویسی پایتون
  4. متغیرها، ثابت ها و لیترال ها در برنامه نویسی پایتون 
  5. انواع داده ها در برنامه نویسی پایتون
  6. تبدیل نوع در برنامه نویسی پایتون
  7. ورودی، خروجی و وارد کردن در برنامه نویسی پایتون
  8. عملگرها در برنامه نویسی پایتون
  9. نام و دامنه در برنامه نویسی پایتون
  10. دستور شرطی if…else در برنامه نویسی پایتون
  11. حلقه for در برنامه نویسی پایتون
  12. حلقه while در برنامه نویسی پایتون
  13. دستورات break و continue در برنامه نویسی پایتون
  14. دستور pass در برنامه نویسی پایتون
  15. توابع در برنامه نویسی پایتون
  16. آرگومان تابع در برنامه نویسی پایتون
  17. تابع بازگشتی در برنامه نویسی پایتون
  18. تابع بی نام/ تابع لامبدا در برنامه نویسی پایتون
  19. متغیرهای سراسری، محلی و غیر محلی در برنامه نویسی پایتون
  20. کلیدواژه global در برنامه نویسی پایتون
  21. ماژول های برنامه نویسی پایتون
  22. پکیج ها در برنامه نویسی پایتون
  23. اعداد و تبدیل نوع داده در برنامه نویسی پایتون 
  24. لیست در برنامه نویسی پایتون
  25. تاپل در برنامه نویسی پایتون 
  26. رشته ها در برنامه نویسی پایتون
  27. مجموعه ها در برنامه نویسی پایتون
  28. دیکشنری در برنامه نویسی پایتون
  29. عملیات ورودی/خروجی در برنامه نویسی پایتون 
  30. دایرکتوری و مدیریت فایل ها در برنامه نویسی پایتون
  31. خطاها و استثناهای توکار در برنامه نویسی پایتون
  32. مدیریت استثناها در برنامه نویسی پایتون
  33. استثناهای تعریف شده توسط کاربر در برنامه نویسی پایتون
  34. برنامه ‌نویسی شی گرا در پایتون
  35. اشیا و کلاس ها در برنامه نویسی پایتون
  36. وراثت در برنامه نویسی پایتون
  37. وراثت چندگانه در برنامه نویسی پایتون
  38. سربارگذاری عملگرها در برنامه نویسی پایتون
  39. تکرار کننده ها در برنامه نویسی پایتون
  40. Generator در برنامه نویسی پایتون
  41. بستار در برنامه نویسی پایتون
  42. دکوراتور در برنامه نویسی پایتون
  43. دکوراتور property در برنامه نویسی پایتون
0
برچسب ها :
نویسنده مطلب erfan molaei

دیدگاه شما

بدون دیدگاه