Regular Expression در پایتون
آیا تا به حال شده که بخواهید رشتهای را در متنی پیدا کنید، که از الگوی خاصی پیروی کند؟ برای این کار از Regular Expression یا به اختصار Regex استفاده میکنیم. Regex از مباحث پرکاربرد در برنامه نویسی است و به دلیل پیچیدگی که دارد، برنامه نویسان کمتر به سراغ آن میروند. اگر بخواهیم تعریف ساده ای از Regex داشته باشیم، می توان گفت که:
قواعد و روش هایی است که با استفاده از آن ها میتوانیم در متن الگویی را مشخص کنیم.
برای مثال یک آدرس ایمیل را فرض کنید. معمولا فرمت آدرسهای ایمیل به صورت local-part@service.domain میباشد. پس الگوی آن به این صورت است که اول یک سری کاراکتر داریم (هر نوع کاراکتری) و به دنبال آن @ داریم. سپس باید سرویسی که ایمیل را در ساخته ایم باشد که می تواند کاراکترهای متفاوتی را در بر بگیرد. بعد از آن باید نقطه ( . ) باشد و سپس آن دامینی که بر روی آن ایمیل ساخته شده است، مانند info@zerotohero.ir
ممکن است درک Regex کمی مشکل باشد. پس به مثالهای زیر دقت کنید.
مثالهایی از Regex
فرض کنید regex های زیر را دارید:
/zerotohero/
این عبارت zerotohero را در متنی تطابق میدهد.
/zero[to]hero/
این عبارت دنبال الگویی است که رشته با zero شروع شود،بعد آن یا o بیاید یا t و سپس در آخر hero بیاید.
/^zerotohero/
عبارت بالا دنبال رشتهای میگردد که با zerotohero شروع شود. مانند رشتههای زیر:
"zerotohero is the best place to learn new things"
حال اگر بخواهیم که با آخر متن تطبیق بدهیم از عبارت زیر استفاده میکنیم:
/zerotohero$/
مانند رشته زیر:
"This is navid from zerotohero"
/^[A-Z][a-z]/
عبارت بالا رشتهای را تطبیق میدهد که حرف اول آن حروف بزرگ انگلیسی یا حروف کوچک انگلیسی باشد. مانند رشتههای زیر:
"zerotohero" "regex"
تست الگوی Regex
برای تست الگو باید ماژول re را import کنید. سپس با تابع ()match تطبیق پیدا کردن آن را تست کنیم.
فرمت کلی تابع ()match به صورت زیر میباشد:
re.match(pattern, string, flags=0)
import re text = "this is navid from zerotohero" matchText = re.match(r'[^this]', text) print(matchText)
اگر اسکریپت بالا را اجرا کنید، عبارتی مانند زیر را دریافت میکنید:
<_sre.SRE_Match object; span=(0, 4), match='this'>
که نشان میدهد رشته ما تطبیق داده شده است و در خانه ۰ تا ۴ رشته ما وجود دارد.
اگر که تطبیق پیدا نکند به ما خروجی None میدهد. مشکل ()match این است که اگر فقط تطبیق در اول رشته پیدا شود، نشان داده خواهد شد.
پس به جای آن از تابع ()search استفاده میکنیم.
فرمت کلی تابع ()search به صورت زیر میباشد:
re.search(pattern, string, flags=0)
import re text = "this is navid from zerotohero" matchText = re.search(r'from', text) print(matchText)
که به ما خروجی زیر را میدهد:
<_sre.SRE_Match object; span=(14, 18), match='from'>
و اگر هم تطبیق پیدا نکند، None برمیگرداند.
تابع بعدی که استفاده میشود ()findall میباشد که لیست تمام تطبیقها را به ما میدهد.
import re text = "this is navid from zerotohero" matchText = re.findall(r'ro', text) print(matchText)
که خروجی زیر را به ما نشان میدهد:
['ro', 'ro', 'ro']
قواعد Regular Expression
الگو | توضیحات |
---|---|
^ | تطبیق اول خط |
$ | تطبیق آخر خط |
. | تطبیق هر تک کاراکتر به جز خط جدید |
[…] | تطبیق هر تک کاراکتر که در کروشه باشد. |
[…^] | تطبیق هر تک کاراکتر که در کروشه نباشد. |
*re | تطبیق تکرارِ ۰ یا بیشتر عبارتِ قبلی |
+re | تطبیق تکرارِ ۱ یا بیشتر عبارتِ قبلی |
?re | تطبیق تکرارِ ۰ یا ۱ عبارتِ قبلی |
re{ n} | تطبیق تکرارِ دقیقاً n بار |
re{ n,} | تطبیق تکرارِ n بار یا بیشتر |
re{ n, m} | تطبیق تکرارِ n بار تا m بار |
a| b | تطبیق a یا b |
(?#…) | کامنت |
\w | تطبیق کلمه |
\W | تطبیق غیر کلمه |
\s | تطبیق فاصله مانند تب و خط جدید |
\S | تطبیق غیر فاصله |
\d | تطبیق عدد |
\D | تطبیق غیر عدد |
\A | تطبیق اول رشته |
\Z | تطبیق آخر رشته (اگر خط جدید داشته باشیم، قبل از خط جدید را تطبیق میدهد) |
\z | تطبیق آخر رشته |
\G | تطبیق نقطهای که آخرین بار تطبیق پایان یافت. |
\b | تطبیق مرز کلمه |
\B | تطبیق مرز غیر کلمه |
\n, \t, etc. | تطبیق خط جدید، تب و غیره |
مثالی از Regex
استفاده از Regex کاملا سلیقهای است، یعنی به هر طریقی بخواهید میتوانید آن را درست کنید.
ایمیل:
\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,6}\b
اول با مرز کلمه شروع میشود، که نشان میدهد قبل از آن می توانیم کلمه داشته باشیم. سپس در کروشه کلمه داریم به علاوهی علامت درصد، به علاوه و خط تیره. بعد از آن باید @ بیاید و در کروشه کلمه داریم، که در آن خط تیره هم میتواند بیاید. سپس باید نقطه داشته باشیم، که بعد از آن میتوانیم فقط حرف داشته باشیم. توجه کنید که در آکولاد تعداد کاراکترهایی که میتوانیم داشته باشیم را میآوریم. در آخر هم باید مرز کلمه تمام شود.
فرض کنید لیست ایمیلهای زیر را داریم:
Mails = """navidagz@zerotohero.ir, Navid Agz, foo bar, navidagz@zerotohero.ir.ar, https://github.com/navidagz, http: // navidagz. Github.io, python @ python, navid@navidagz.com.ar, pythonAR@python.pythonAR """
حال با این عبارتی که نوشتیم، تست میکنیم:
mail= re.findall(r'\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,6}\b', Mails) print(mail) # >> ['navidagz@zerotohero.ir', 'navidagz@zerotohero.ir.ar', 'navid@navidagz.com.ar']
در این مقاله سعی شده که تقریبا تمامی قواعد Regular Expression در Python پوشش داده شود. پیاده سازی الگوهای دیگر می تواند تمرین خوبی برای درک بیشتر این مبحث باشد. به عنوان تمرین می توانید الگوی password را پیاده سازی کنید.
مطالب زیر را حتما مطالعه کنید
آشنایی با توابع در پایتون
راه اندازی Django به همراه Postgresql، Nginx و Gunicorn
آشنایی با حلقه ها در پایتون
آشنایی با رشته در پایتون
برنامه نویسی چند نخی در پایتون
تولید اعداد Random با Python
1 Comment
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
ممنون از سایت بسیار عالیتون. من اصلا برنامه نویسی نمیدونم و با اموزش بات تلگرامیتون الان به خودم میتونم بات های ساده بنویسم.
لطفا یه مطلب هم درمورد مولتی تردینگ بگذارید
من این رو خوندم ولی چیزی نفهمیدم
https://www.tutorialspoint.com/python3/python_multithreading.htm