مجله خبری برنامه‌نویسی پایتون

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

مجله خبری برنامه‌نویسی پایتون

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

مجله خبری برنامه‌نویسی پایتون

زبان پایتون (Python) در سال ۱۹۹۱ توسط یک برنامه‌نویس هلندی به نام گیدو ون روسوم (Guido van Rossum) ابداع شد و از آن زمان تا کنون رشد قابل ملاحظه‌ای را شاهد بوده است.

اگر چه وی در آن زمان گفته بود: «من به هیچ وجه قصد ندارم زبانی بسازم که به طور گسترده مورد استفاده قرار بگیرد» ولی اکنون و با گذشت نزدیک به سه دهه از آن تاریخ، پایتون تقریباً تمام رقبای خود را کنار زده و به اندازه‌ای محبوبیت یافته که حتی افراد مبتدی نیز کدنویسی را با آن شروع می‌کنند.

در یک سال گذشته، «Python» یکی از کلماتی بود که شهروندان آمریکایی بسیار زیاد در گوگل جستجو کرده‌اند، حتی بیشتر از نام ستاره‌های تلویزیونی.

۳ مطلب با کلمه‌ی کلیدی «عبارت منظم در پایتون» ثبت شده است

عبارت های منظم برای تاریخ ها


تاریخ ها معمولا به شکل متنوعی نوشته خواهند شد. بعنوان مثال اگر بخواهیم بنویسیم 23 اکتبر 2018 میتوانیم به هر یک از صورتهای پایین بنویسیم:


23-10-2018

23/10/2018

23/10/18

10/23/2018

23 oct 2018

23 october 2018

oct 23, 2018

october 23, 2018


عبارت منظمی که میتوانیم برای تاریخ بنویسیم تا  مورد اول، دوم و چهارم رو پوشش بده میتونه به این صورت باشه:


\d{2}[/-]\d{2}[/-]\d{4}


بعنوان مثال رشته زیر رو در نظر بگیرید: (n/  اشاره به خط بعد دارد.)


» datestr = '23-10-2018 \n23/10/2018 \n23/10/18 \n10/23/2018 \n23 oct 2018 \n23 october 2018 \noct 23, 2018 \noctober 23, 2018\n'


» re.findall(r'\d{2}[/-]\d{2}[/-]\d{4}', datestr)

['23-10-2018', '23/10/2018', '10/23/2018']


خوب همانطور که در خروجی کد فوق مشاهده میکنید تاریخ های که ابتدا دو رقمی بودن سپس با علامتهای / و - جدا شدند و دوباره دو رقم و علامت / و - تکرار شدند و در نهایت نیز 4 رقم برای سال ذکر شده بعنوان خروجی نمایش داده خواهند شد.


حالا برای اینکه بهبود بدیم این کد رو تا برای حالت دوم هم پوشش بده کافیه بخش آخر یه تغییر ایجاد کنیم بصورت زیر:(در واقع مقدار سال میتونه دو رقم تا 4 رقم رو در نظر بگیره)


» re.findall(r'\d{2}[/-]\d{2}[/-]\d{2,4}', datestr)

['23-10-2018', '23/10/2018', '23/10/18', '10/23/2018']



دقت کنید زمانهای این امکان وجود داره که تاریخ روز و ماه بصورت تک رقمی نوشته بشه کافیه کد رو بصورت زیر اصلاح کنیم:

re.findall(r'\d{1,2}[/-]\d{1,2}[/-]\d{2,4}', datestr)




عبارت های منظم برای تاریخ ها (برای چهار حالت دوم)

برای این حالت میتونیم عبارت منظم رو بصورت زیر بنویسیم شاید در نگاه اول باید خروجی درست به ما بده و حالت زیر رو بعنوان خروجی برگردونه :
23 oct 2018

» re.findall(r'\d{2} (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{4}', datestr)

['Oct']

ولی میبینیم جواب ما اشتباه خواهد شد.دلیلش وجود پرانتز است که سبب میشود عبارت داخل پرانتز بعنوان یک متغیر جداگانه در نظر گرفته شوید. برای اینکه کد رو اصلاح کنیم از علامت :? استفاده میکنیم که سبب می شود تا عبارت داخل پرانتر بعنوان یک متغیر جدا در نظر گرفته نشود :

» re.findall(r'\d{2} (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{4}', datestr)

['23 Oct 2018']

حالا برای بهبودش که حالت زیر رو هم در نظر بگیره از این روش استفاده میکنیم:
23 october 2018

» re.findall(r'\d{2} (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]* \d{4}', datestr)

['23 Oct 2018', '23 October 2018']

متاکارکتر *[a-z] سبب میشه تمام کارکترهای بعد از ماه تکرار میشه رو هم در نظر بگیره و این کارکترها میتونه صفر یا هر تعدادی باشه.

اما باز عبارت منظم رو بهبود بدهیم که دو حالت آخر رو در نظر بگیره، میتونیم از علامت سوال استفاده کنید. علت استفاده از علامت سوال اینه که هر عبارت قبل از اون میتونه یکبار بیاد و میتونه کلا نیاد. بیاییم کدشو رو بنویسیم.

» re.findall(r'(?:\d{2} )?(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]* (?:\d{2}, )?\d{4}', datestr)

['23 Oct 2018', '23 October 2018', 'Oct 23, 2018', 'October 23, 2018']

❇️ پیدا کردن الگوهای با عبارتهای منظم


اینکه بگوییم چیزی با @ شروع میگردد یک الگو می باشد برای ما کافی نیست. بلکه نشانه های است که با @ شروع می شوند و چیزی رو باید دنبال کنند.

برای مثال چگونه میتوانیم تشخیص دهیم که اگر @ در جمله ای ذکر شد آن شامل الگو خاص ما خواهد شد یا خیر. حالتهای که ممکن است بعد از @ وارد شود و آن کلمه را تبدیل به یک الگو خاص نمایید رو یادداشت میکنیم:


انظباق چیزهای بعد از @


- حروف الفبا

-اعداد

-نشانه های خاصی مانند (_)


مثال : 

@UN_Spokesperson

@Python

@10years


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

@[A-Za-z0-9_]+


حروف الفبای بزرگ و کوچک، اعداد صفر تا 9 ، آندرلاین

با علامت + بعد از کروشه مشخص میکنیم این عبارتها میتوانند تکرار گردند.


حالا در ادامه نحوه نوشتن کد برای این عبارت منظم را خواهیم گفت


❇️ حالا بیاییم مثال قبل رو ادامه بدهیم جایی که کلمات با @ شروع میشدند. برای عبارتهای منظم ما یک کتابخانه re داریم که باید ابتدا ایمپورتش کنیم.

در واقع این کتابخانه برای عبارتهای منظم هست و دو حرف اول Regular Expressions هست.

برای این مورد خاص از متد search برای پیدا کردن عبارت منظمی که گفتیم استفاده میکنیم.


>>> import re

>>> [w for w in text13 if re.search('@[A-Za-z0-9_]+', w)]

['@UN', '@UN_Women']


الان در نتیجه مشاهده میکنیم که @ اول که بعدش یک فاصله بود در خروجی چاپ نخواهد کرد. و تمام الگوهای مورد نظر ما فقط در خروجی نمایش داده شد.


یکبار دیگه عبارت منظمی که استفاده کردیم رو تجزیه و تحلیل میکنیم:

@[A-Za-z0-9_]+


این عبارت منظم از سه بخش تشکیل شده است.


1- بخش اول علامت @ است و به قید و شرط باید استفاده گردد.

2- بخش دوم حروف بزرگ A-Z و حروف کوچک a-z و اعداد بین صفر تا نه خواهد بود . دقت کنید همه اعدادهای چند رقمی هم از این 10 عدد صفر تا نه تشکیل شده اند. همچنین آندرلاین (_) هم میتواند قرار داشته باشد. این بخش داخل یک کروشه قرار خواهد گرفت.

3- بخش سوم علامت + است که بعد از کروشه خواهد آمد. این علامت نشان دهنده این است که عبارتهای داخل کروشه میتوانند تکرار گردند.یعنی شما میتوانید یک عدد را بارها تکرار کنید یا حروف الفبای بزرگ و کوچک را تکرار نمایید.که به این علامت متاکارکتر در عبارتهای منظم گویند که در بخش بعد توضیحات بیشتری ارائه خواهیم کرد.

دریافت



❇️ در درس سوم میخواهیم در مورد عبارتهای منظم و پردازش روی متن های آزاد صحبت کنیم. هنگامی که شما در حال پردازش متن آزاد هستید، عبارتها و الگوهای منظم نقش مهمی را ایفا خواهند کرد. بنابراین بگذارید یک مثال بزنیم.


❇️ متن زیر یکی از توییتهای سخنگوی سازمان ملل می باشد:


»> text12 = '"Ethics are built right into the ideals and objectives of the United Nations" #UNSG @ NY Society for Ethical Culture bit.ly/2guVelr @UN and @UN_Women'


❇️ در این متن یک اصطلاح مشاهده می شود که با # مشخص شدند و یک سری کلمات که با @ مشخص شدند و همچنین یک لینکی رو مشاهده میکنید. اگر بخواهیم این موارد رو استخراج کنیم، گام اول اینه که ما بیاییم با متد split کلمات رو از هم جدا کنیم


»> text13 = text12.split(' ')


»> text13


['"Ethics', 'are', 'built', 'right', 'into', 'the', 'ideals', 'and', 'objectives', 'of', 'the', 'United', 'Nations"', '#UNSG', '@', 'NY', 'Society', 'for', 'Ethical', 'Culture', 'bit.ly/2guVelr', '@UN', 'and', '@UN_Women']


❇️ حالا چگونه میتونیم هشتک ها  و ات ساین ها رو پیدا کنیم، خوب بریم تو بخش بعدی و این کلمات خاص رو پیدا کنیم



❇️ پیدا کردن عبارتهای خاص

🔸هشتک ها

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

»> [w for w in text13 if w.startswith('#')]
['#UNSG']

🔸 ات ساین

( کلماتی که با @ شروع میگردند) : همان دستور بالا رو مینویسیم فقط بجای شارپ از ات ساین استفاده میکنیم:

»> [w for w in text13 if w.startswith('@')]
['@', '@UN', '@UN_Women']

اتفاقی که در بالا افتاد کلمه بعد از @ نیومده و دلیلش فاصله ای است که بین @ و کلمه بعدش بود. حالا برای این مشکل باید چیکار کنیم. عبارت های خاص در این بخش لزوما باید یک کلمه ای باشد که با @ چسبیده باشد. و اگر @ به تنهایی وارد شد را نباید بعنوان یک عبارت خاص در نظر گرفت. در بخش بعدی راه حلی را ارائه خواهیم داد.