RegEx در پایتون — به زبان ساده
در این مطلب، RegEx در پایتون ضمن بیان مفهوم آن، به طور کامل و همراه با مثالهای متعدد مورد بررسی قرار گرفته است.
RegEx در پایتون
در مطلب RegEx در پایتون «عبارات با قاعده» (RegEx) و روش استفاده از ماژول re در «زبان برنامهنویسی پایتون» (Python Programming Language) برای کار با RegEx، همراه با چندین مثال آموزش داده میشود.
یک عبارت با قاعده (Regular Expression | RegEx) یک توالی از کاراکترها است که الگوی جستجو را مشخص میکند. مثال زیر در این راستا قابل توجه است.
^a...s$
کد بالا، الگوی RegEx را تعریف میکند. الگو در واقع «هر رشته پنج کلمهای که با a آغاز و با s پایان یابد» است. یک الگوی تعریف شده با استفاده از RegEx را میتوان برای تطبیق رشته استفاده کرد.
پایتون دارای یک ماژول با نام re برای کار با RegEx است. در ادامه، مثالی برای این مورد آورده شده است.
1import re
2
3pattern = '^a...s$'
4test_string = 'abyss'
5result = re.match(pattern, test_string)
6
7if result:
8 print("Search successful.")
9else:
10 print("Search unsuccessful.")
در اینجا از تابع ()re.match برای جستجوی pattern درون test_string استفاده میشود. این متد، یک شی مطابق را در صورت موفقیت جستجو، باز میگرداند. در غیر این صورت، None را باز میگرداند. چندین تابع دیگر نیز وجود دارند که در ماژول re برای کار با RegEx تعریف شدهاند. پیش از بررسی ماژول ، مبحث عبارات با قاعده مورد بررسی قرار میگیرد.
تعریف الگو با استفاده از RegEx
برای تعریف عبارت با قاعده، متاکاراکترها (metacharacters) مورد استفاده قرار میگیرند. در مثال بالا، ^ و $ متاکاراکترها هستند. در ادامه مطلب RegEx در پایتون متاکاراکترها معرفی شدهاند.
متاکاراکترها
متاکاراکترها، در واقع کاراکترهایی هستند که به شیوه خاصی با استفاده از موتور RegEx تفسیر میشوند. در ادامه، لیستی از متاکاراکترها آورده شده است.
[] . ^ $ * + ? {} () \ |
[] - آکولاد
آکولاد، مجموعه کاراکترهایی را تعیین میکند که فرد قصد تطبیق آنها را دارد.
در اینجا، در صورتی [abc] تطبیق پیدا میکند که رشتهای که کاربر تایپ میکند حاوی هر یک از کاراکتر b ،a و یا c باشد. همچنین، میتوان طیفی از کاراکترها را با استفاده از - درون آکولاد تعیین کرد.
- [a-e] مشابه [abcde] است.
- [1-4] مشابه [1234] است.
- [0-39] مشابه [01239] است.
میتوان یک مجموعه کاراکتر را با استفاده از علامت ^ در آغاز آکولاد، متمم (معکوس) کرد.
- [abc^]: به معنای هر کاراکتری است به جز b ،a و c.
- [0-9^]: به معنای هر کاراکتر غیر عددی است.
. دوره زمانی
یک دوره زمانی هر کاراکتر جدایی را تطبیق میدهد (به جز خط جدید 'n\').
^ - کلاه
علامت ^ برای بررسی اینکه آیا یک رشته با کاراکتر خاصی شروع میشود یا نه مورد استفاده قرار میگیرد.
$ دلار
علامت دلار $ برای بررسی اینکه آیا یک رشته با کاراکتر خاصی پایان مییابد یا نه، مورد استفاده قرار میگیرد.
* ستاره
علامت ستاره * صفر یا بیشتر، تعداد وقوع رشتهای که به آن داده شده را محاسبه میکند.
+ جمع
علامت جمع + یک یا تعداد بیشتر وقوع الگوی داده شده به آن را محاسبه میکند.
همانطور که در تصویر زیر مشاهده میکنیم.
? علامت سوال
علامت سوال ؟ صفر یا تعداد بیشتری وقوع الگوی داده شده به آن را محاسبه میکند.
{} براکت
کد مقابل مفروض است: {n,m}. این کد یعنی حداقل n و حداکثر m تکرار از الگو به آن سپرده شده است.
در ادامه، مثال دیگری ارائه شده است. RegEx برای {2, 4}[۹-۰] حداقل با ۲ رقم تطبیق پیدا میکند، ولی با بیش از ۴ رقم تطبیق پیدا نمیکند.
| خط عمودی
خط عمودی | برای تناوب (یا عملگر or) مورد استفاده قرار میگیرد.
در اینجا، a|b با هر رشتهای که حاوی a یا b است، تطبیق پیدا میکند.
() گروه
جفت پرانتز () برای گروه کردن زیر الگوها مورد استفاده قرار میگیرد. برای مثال، a|b|c)xz)، با هر رشتهای که با a یا b یا c که در دنباله آن xy آمده باشد، مطابقت پیدا میکند.
\ بکاسلش
بکاسلش، برای پرش از کاراکترهای مختلف شامل همه متاکاراکترها مورد استفاده قرار میگیرد. برای مثال، a$\ در صورتی تطبیق پیدا میکند که $ با a دنبال شود. در اینجا، $ توسط موتور RegEx به شیوه خاصی تفسیر نمیشود.
اگر کاربر اطمینان ندارد که یک کاراکتر دارای معنای خاصی است، میتواند \ را پیش از آن قرار دهد. این کار موجب میشود تا کاربر اطمینان حاصل کند که کاراکتر به شیوه خاصی تفسیر نمیشود. توالیهای خاص، نوشتن الگوهای متداول استفاده شده را آسانتر میکنند. در ادامه، فهرستی از توالیهای خاص آورده شده است.
A\ در صورتی تطبیق پیدا میکند که یک کاراکتر تعیین شده در آغاز رشته وجود داشته باشد.
b\ در صورتی تطبیق پیدا میکند که کاراکترهای تعیین شده در آغاز یا پایان یک کلمه باشند.
B\ برعکس b\ است. B\ در صورتی تطبیق پیدا میکند که کاراکترهای تعیین شده در آغاز یا پایان یک کلمه نباشند.
d\ با هر عدد اعشاری تطبیق پیدا میکند و در واقع، مساوی با [۹-۰] است.
D\ با هر رقم غیر اعشاری تطبیق پیدا میکند و در واقع، برابر با [۹-۰^] است.
s\ جایی تطبیق پیدا میکند که رشته حاوی کاراکتر «وایتاسپیس» (whitespace) ب اشد و در واقع، برابر با [t\n\r\f\v\] است.
S\ وقتی تطبیق پیدا میکند که یک رشته حاوی هرگونه کاراکتر غیر وایتاسپیس (non-whitespace) باشد و در واقع، برابر با [t\n\r\f\v\^] است.
w\ با هر کاراکتر «حرفیعددی» (Alphanumeric) (ارقام و حروف الفبا) تطبیق پیدا میکند. برابر با [_a-zA-Z0-9] است. شایان توجه است که زیرخط _ هم یک کاراکتر حرفیعددی محسوب میشود.
W\ با هر کاراکتر غیر حرفیعددی تطبیق پیدا میکند و در واقع، برابر با [_a-zA-Z0-9^] است.
Z\ در صورتی تطبیق پیدا میکند که کاراکتر تعیین شده در پایان یک رشته باشد.
نکته: برای ساخت و تست عبارات با قاعده، میتوان از ابزارهای تست RegEx، مانند regex101 استفاده کرد. این ابزارها نه تنها به کاربر در ساخت عبارات با قاعده کمک میکنند، بلکه به یادگیری آن نیز کمک میکنند. اکنون که مبانی RegEx مورد بررسی قرار گرفت، روش استفاده از RegEx در کد پایتون بررسی میشود.
ماژول مربوط به RegEx در پایتون
پایتون دارای یک ماژول با نام re برای کار با عبارات با قاعده است.
برای استفاده از این ماژول، نیاز به «وارد کردن» (import) ماژول re است.
import re
ماژول، چندین تابع و ثابت را برای کار با RegEx تعریف میکند.
()re.findall
متد ()re.findall لیستی از رشتهها را که حاوی همه تطبیق پیدا میکند، باز میگرداند.
مثال ۱: ()re.findall
1# Program to extract numbers from a string
2
3import re
4
5string = 'hello 12 hi 89. Howdy 34'
6pattern = '\d+'
7
8result = re.findall(pattern, string)
9print(result)
10
11# Output: ['12', '89', '34']
در صورتی که الگو یافته نشود، ()re.findall یک لیست خالی باز میگرداند.
()re.split
متد re.split، رشتهای را که در آن تطبیق پیدا شده است، تقسیم میکند و لیستی از رشتهها را باز میگرداند که در آن تقسیمبندی اتفاق میافتد.
مثال 2: ()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 به صورت زیر است:
1re.sub(pattern, replace, string)
این متد، رشتهای را باز میگرداند که در آن موارد مطابق با الگو، با محتوای قرار گرفته به جای متغیر replace جایگزین میشوند. توجه کنید که متغیر replace را با مفهوم متد Replace در پایتون اشتباه نگیرید.
مثال ۳: ()re.sub
1# Program to remove all whitespaces
2import re
3
4# multiline string
5string = 'abc 12\
6de 23 \n f45 6'
7
8# matches all whitespace characters
9pattern = '\s+'
10
11# empty string
12replace = ''
13
14new_string = re.sub(pattern, replace, string)
15print(new_string)
16
17# Output: abc12de23f456
اگر الگو پیدا نشد، ()re.sub رشته اصلی را باز میگرداند.
میتوان count را به عنوان چهارمین پارامتر به متد ()re.sub پاس داد. در صورت حذف این متغیر، نتیجه صفر میشود. این موجب میشود همه وقوعها جایگزین شوند.
1import re
2
3# multiline string
4string = 'abc 12\
5de 23 \n f45 6'
6
7# matches all whitespace characters
8pattern = '\s+'
9replace = ''
10
11new_string = re.sub(r'\s+', replace, string, 1)
12print(new_string)
13
14# Output:
15# abc12de 23
16# f45 6
()re.subn
()re.subn مشابه با ()re.sub است، با این تفاوت که یک تاپل با دو آیتم که حاوی رشته جدید و تعداد جایگزینیهای انجام شده است را باز میگرداند.
مثال ۴: ()re.subn
1# Program to remove all whitespaces
2import re
3
4# multiline string
5string = 'abc 12\
6de 23 \n f45 6'
7
8# matches all whitespace characters
9pattern = '\s+'
10
11# empty string
12replace = ''
13
14new_string = re.subn(pattern, replace, string)
15print(new_string)
16
17# Output: ('abc12de23f456', 4)
()re.search
()re.search متد دو آرگومان را دریافت میکند: یک الگو و یک رشته. متد به دنبال اولین محلی میگردد که الگوی RegEx، اولین رشته مطابق را تولید میکند. اگر جستجو موفقیتآمیز بود، ()re.search یک رشته مطابق را پیدا میکند. در غیر این صورت، None را باز میگرداند.
1match = re.search(pattern, str)
مثال ۵: ()re.search
1import re
2
3string = "Python is fun"
4
5# check if 'Python' is at the beginning
6match = re.search('\APython', string)
7
8if match:
9 print("pattern found inside the string")
10else:
11 print("pattern not found")
12
13# Output: pattern found inside the string
در اینجا، match حاوی شی تطبیق است.
شی تطبیق
میتوان متدها و خصیصههای یک «شی تطبیق» (Match object) را با استفاده از تابع ()dir دریافت کرد. برخی از متدهای متداول استفاده شده و شیهای تطبیق عبارتند از:
()match.group
متد ()group بخشی از رشته که تطبیق پیدا میکند را باز میگرداند.
مثال ۶: شی تطبیق
1import re
2
3string = '39801 356, 2102 1111'
4
5# Three digit number followed by space followed by two digit number
6pattern = '(\d{3}) (\d{2})'
7
8# match variable contains a Match object.
9match = re.search(pattern, string)
10
11if match:
12 print(match.group())
13else:
14 print("pattern not found")
15
16# Output: 801 35
در اینجا، متغیر match، حاوی یک شی تطبیق داده شده است. الگوی (\d{3}) (\d{2}) دارای دو زیر گروه (\d{3}) و (\d{2}) است. میتوان بخشی از رشته این زیرگروه پرانتز گذاری شده را دریافت کرد. در زیر، روش انجام این کار نمایش داده شده است:
1>>> match.group(1)
2'801'
3
4>>> match.group(2)
5'35'
6>>> match.group(1, 2)
7('801', '35')
8
9>>> match.groups()
10('801', '35')
()match.start(), match.end() and match.span
تابع ()start اندیس شروع زیررشته تطبیق یافته را باز میگرداند. به طور مشابه، ()end اندیس پایانی رشته تطبیق یافته را باز میگرداند.
1>>> match.start()
22
3>>> match.end()
48
تابع ()span، یک تاپل حاوی اندیس ابتدایی و پایانی از محل تطبیق داده شده را باز میگرداند.
1>>> match.span()
2(2, 8)
match.re و match.string
خصیصه re از شی تطبیق یافته یک شی عبارت با قاعده را باز میگرداند. به طور مشابه، خصیصه string رشته پاس داده شده را باز میگرداند.
1>>> match.re
2re.compile('(\\d{3}) (\\d{2})')
3
4>>> match.string
5'39801 356, 2102 1111'
در بالا، همه متدهای محبوبی که در ماژول re موجود هستند، معرفی شدهاند.
استفاده از پیشوند r پیش از Regex
هنگامی که پیشوند r یا R پیش از یک عبارت با قاعده مورد استفاده قرار میگیرد، به معنای رشته خام است.
برای مثال، 'n\' یک خط جدید است که r'\n' در آن به معنی دو کاراکتر است: یک بکاسلش \ که به دنبال آن n وجود دارد. بکاسلش \ برای گذر دادن کاراکترهای گوناگون شامل همه «متاکاراکترها» (Metacharacters) مورد استفاده قرار میگیرد. اگرچه پیشوند r موجب میشود \ مانند یک کاراکتر نرمال برخورد کند.
مثال ۷: رشته خام با استفاده از پیشوند r
1import re
2
3string = '\n and \r are escape sequences.'
4
5result = re.findall(r'[\n\r]', string)
6print(result)
7
8# Output: ['\n', '\r']
معرفی فیلم آموزش پایتون فرادرس
برای فراگیری پایتون استفاده از فیلمهای آموزشی به زبان فارسی فرادرس پیشنهاد میشوند که در ادامه مطلب RegEx در پایتون معرفی شدهاند.
معرفی فیلم آموزش پایتون مقدماتی
مدت زمان فیلم آموزش پایتون مقدماتی برابر با نوزده ساعت و پنجاه و سه دقیقه و مدرس آن مهندس پژمان اقبالی است. فیلم آموزش پایتون مقدماتی که در این بخش از مطلب RegEx در پایتون معرفی شده برای افراد تازهوارد به دنیای برنامهنویسی پایتون و کسانی که با پایتون تا حدی آشنا هستند و قصد دارند سطح دانش و مهارت خود را بیش از پیش ارتقا دهند مناسب است. در فیلم آموزش مقدماتی پایتون، ضمن معرفی و آموزش چگونگی نصب پایتون، مباحث ساختمان دادهها در پایتون، توابع و ماژولها، کلاس، خواندن و نوشتن فایلها و دیگر موارد مورد بررسی قرار میگیرند.
- برای دیدن فیلم آموزش پایتون مقدماتی + اینجا کلیک کنید.
معرفی فیلم آموزش کار با کتابخانه های NumPy و Matplotlib در پایتون
مدت زمان فیلم آموزش کار با کتابخانه های NumPy و Matplotlib در پایتون چهار ساعت و چهل و شش دقیقه و مدرس آن مهندس میترا تجربهکار است. در این دوره که در این بخش از مطلب RegEx در پایتون معرفی شده، مباحث پیشرفتهتر و در واقع تکمیلی آموزش برنامهنویسی پایتون مورد بررسی قرار گرفته است. بنابراین، این دوره برای افرادی مناسب است که فیلم آموزش مقدماتی پایتون را مشاهده کردهاند و یا، با مبانی پایتون به طور کامل آشنایی دارند. از جمله موضوعات مورد بررسی در فیلم آموزش پایتون تکمیلی میتوان به معرفی و تعریف آرایهها در زبان پایتون، معرفی بسته نامپای (NumPy)، رسم نمودار در پایتون و دیگر موارد اشاره کرد.
- برای دیدن فیلم آموزش پایتون تکمیلی + اینجا کلیک کنید.
معرفی فیلم آموزش پایتون با مثالهای عملی
مدت زمان فیلم آموزش پایتون با مثالهای عملی سیزده ساعت و بیست دقیقه است. مدرس دوره آموزش پایتون فرادرس با مثالهای عملی، مهندس فرشید شیرافکن است. این فیلم آموزش پایتون که در این بخش از مطلب RegEx در پایتون معرفی شده برای افرادی مناسب است که در صدد یادگیری پایتون از پایه و به صورت عملی، همراه با بررسی مثالها و حل مسائل نمونه با استفاده از برنامهنویسی پایتون هستند. از جمله سرفصلهای این دوره میتوان به معرفی انواع دادهها در پایتون، عملگرها، دستورات شرطی، حلقهها، رشته، لیست، تاپل، دیکشنری، توابع، عبارات منظم و الگوریتمهای مرتبسازی اشاره کرد.
- برای دیدن فیلم آموزش پایتون فرادرس با مثالهای عملی + اینجا کلیک کنید.
معرفی فیلم آموزش پایتون با برنامهنویسی شیگرا
مدت زمان فیلم آموزش پایتون با برنامهنویسی شیگرا هفت ساعت و بیست و نه دقیقه و مدرس آن، مهندس فرشید شیرافکن است. این دوره که در این بخش از مطلب RegEx در پایتون معرفی شده برای افرادی که با زبان برنامهنویسی پایتون آشنایی دارند و در صدد یادگیری شیگرایی در این زبان هستند، مناسب است. در این دوره آموزشی، مباحث گوناگون پیرامون شیگرایی شامل شی، کلاس، شیگرایی، ارثبری، پلیمورفیسم و سربارگذاری عملگرها مورد بررسی قرار گرفته است.
- برای دیدن فیلم آموزش پایتون با برنامهنویسی شیگرا + اینجا کلیک کنید.
معرفی فیلم آموزش پایتون برنامه نویسی متا
طول مدت این دوره آموزشی دو ساعت و نه دقیقه و مدرس آن مهندس پژمان اقبالی است. در این دوره آموزشی که در این بخش از مطلب RegEx در پایتون معرفی شده، مفهوم برنامهنویسی متا (متا پروگرامینگ) بیان شده و چگونگی برنامه نویسی متا در پایتون تشریح شده است.
- برای دیدن فیلم آموزش پایتون برنامهنویسی متا + اینجا کلیک کنید.
معرفی فیلم آموزش پایتون الگوهای طراحی
مدت زمان فیلم آموزش پایتون الگوهای طراحی دوازده ساعت و بیست و شش دقیقه و مدرس آن، مهندس پژمان اقبالی شمسآبادی است. این دوره آموزشی که در این بخش از مطلب RegEx در پایتون معرفی شده، برای کسانی که با زبان پایتون آشنایی دارند و در صدد آن هستند که مهارتهای خود را در این زبان افزایش بدهند و به نیروی برنامهنویسی متخصصتری مبدل شوند، مناسب است. الگوی طراحی برای حل مسائل پیرامون طراحی نرمافزارها مورد استفاده قرار میگیرند.
از جمله سرفصلهای مورد بررسی در این دوره آموزشی که که در این بخش از مطلب چرا پایتون یاد بگیریم معرفی شده میتوان به مفهوم الگوهای طراحی، الگوی طراحی یگانه (Singleton Design Pattern)، الگوی طراحی کارخانه (Factory Design Pattern)، الگوی طراحی پروکسی (Proxy Design Pattern)، الگوی طراحی مشاهده کنننده (Observer Design Pattern)، الگوی طراحی فرمان (Command Design Pattern)، الگوی طراحی روش قالب (Template Method Design Pattern)، الگوی طراحی مدل-نمایش-کنترلر (Model-View-Controller Design Pattern) و الگوی طراحی وضعیت (State Design Pattern) اشاره کرد.
- برای دیدن فیلم آموزش پایتون الگوهای طراحی + اینجا کلیک کنید.