Mr.Python

آموزش کاربردی ریجکس ها در پایتون Regex

6 ارسال در این موضوع قرار دارد

با سلام

عبارت Regular Expressions به معنی عبارات منظم (اصطلاحات با قاعده ) و مخفف آن re از حروف اول این عبارت گرفته شده است .

از کاربرد این مبحث میشه به : استخراج اطلاعات از دیتابیس ها - متون - کد ها - لوگ فایل ها - صفحات گسترده ای با متون زیاد - اسناد و هر چی که داخلش متن باشه . شما با استفاده از این عبارات میتونید اطلاعات <<خاصی>> که مد نظر دارید استخراح کنید.

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

نکته : همانطور که گفته شد تمام علایم و حروف و نماد ها و سیمبل ها همگی کاراکتر هستند.

مثال : میخواهیم از رشته های زیر abc را جدا کنیم :

abcdefg

abcde

abc

خب ما الان فقط abc رو میخوایم پس ریجکس این مثال میشه همون :

abc

در واقع یافتن صرفا یه کلمه یا یه حرف یا عدد یا ... که میدونیم چیه داخل یه رشته کافیه همون رو بکار ببریم مثلا من میخواستم abc رو از رشته بکشم بیرون پس همین رو به عنوان ریجکس قرار میدم یعنی : abc .

مثال دیگر :

abc123g-moj

حالا من 123 رو میخوام پس فقط ریجکس میشه همون 123

اما یه کار دیگم میتونید بکنید - کاراکتر w\ برای اشاره کردن به حروف زبان انگلیسی و اعداد هست و این کاراکتر به تنهایی یعنی (هر حرف زبان انگلیسی و اعداد) - w مخفف کلمه word هست . مثلا ما در سه رشته بالا میدونیم abc در سمت چپ رشته ها قرار دارد پس برای یافتن abc نوشتن ریجکس زیر کفایت میکند :

\w\w\w

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

با گذاشتن یک + در انتهای این کاراکتر میتوانید بگویید تمام کاراکتر هارا به من نشان بده :

\w+

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

abcdefg ==> \w+ ==> abcdefg

abcde ==> \w+ ==> abcde

abc ==> \w+ ==> abc

نکته بعدی : اگر میخواید از تکرار کاراکتر w\ جلوگیری کنید مثلا بجای اینکه بنویسید w\w\w\ از یه کاراکتر w\ استفاده کنید اما باز نتیجه ی w\w\w\ را بدهد  میتوانید از آکولاد استفاده کنید . به مثال زیر توجه کنید:

Guardiran ==> \w{4} ==> Guar

Mojtaba ==> \w{5} ==> mojta

مثال های دیگر :

mojtaba ==> \w\w\w ==> moj
mojtaba ==> \w+ ==> mojtaba
guardiran  ==> \w\w\w\w ==> guar
Team ==> \w{1,3} ==> Tea --> معنیش میشه اینکه حداکثر تا سه کاراکتر رو نشون بده
security ==> \w{3} ==> sec
password ==> \w{4} ==> pass
123Guard ==> \w{3} ==> 123
123Guard ==> \w\w\w ==> 123

در درس های بعدی بیشتر با w\ اشنا میشویم پس اگر اشکال دارید بعدا دوباره توضیح خواهیم داد. آموزش نیاز به درک کاملی از رشته ها و کاراکتر ها در پایتون دارد . مبحث ریجکس کار عملیه پس باید حتما پا به پای آموزش بررسی کنید مثال هارو .

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

تو این قسمت هم چند تا مثال میزنیم :
مثلا من کلمه python رو میخوام از رشته زیر بکشم بیرون :

one of the best high level programming language : python

خب کافیه ریجکس رو همون python انتخاب کنیم:

python

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

میتونیم از ریجکس زیر هم استفاده کنیم:

: \w+

یا از دو ریجکس زیر هم میشه استفاده کرد:

: \w\w\w\w\w\w
: \w{6}

مبینید که من علامت کالن ( : ) رو گذاشتم و یه فاصله دادم و بعد از کاراکتر w\ استفاده کردم . چرا؟ چون اگه به رشته نگاه بندازید کلمه python با یک فاصله بعد از دو نقطه ( : ) نوشته شده. و دارای 6 حرف هست پس من هم عدد 6 رو داخل آکولاد نوشتم که مشخص بشه کلمه ای که میخوام 6 حرفی هست.

به رشته زیر نگاهی بندازید:

first expression is ttguardiran and the second is ttpython

خب من میخوام ریجکسی بنویسم که دو عبارت ttguardiran , ttpython رو ازش بکشم بیرون اما نمیخوام از خود این ها به عنوان ریجکس استفاده کنم پس میام اینکارو میکنم:

tt\w{6,9}

خب حالا معنیش چیه؟ دارم میگم : من کلماتی رو از رشته میخوام که اولش با tt شروع میشه و این کلمات حداقل 6 حرف و حداکثر 9 حرف دارند.

نکته: تنها دو عدد داخل اکولاد جای میگیرد اولی از سمت چپ بیانگر حداقل تعداد کاراکتر ها و دومی از سمت چپ هم بیانگر حداکثر تعداد کاراکتر هاست. یعنی 6 حداقل و 9 حداکثر. پس اگر ما عبارت دیگه ای داشتیم که با tt شروع بشه و 7 حرف بعد اون وجود داشته باشه هم شامل ریجکس ما میشه.

و همونطور که میبینید کلمه python از 6 حرف و guardiran از 9 حرف ساخته شده.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

در این درس با کاراکتر d\ اشنا میشیم .

این کاراکتر به تنهایی بیانگر هر عدد بین 0 تا 9 هست. d حرف اول کلمه digit هست . اعداد 0 تا 9 انگلیسی رو تو کامپیوتر اعداد دیجیتالی هم میگن برا همین اینجوری نامگذاری شده.

یک کاراکتر d\ به تنهایی بیانگر یک عدد هست . و همانطور که قبلا صحبت کردیم علامت + به انتهای این کاراکتر هم میتونه بچسبه و همون معنی رو میده یعنی +d\ بیانگر همه اعداد هست. تو اینجا باز هم میتونید از آکولاد ها استفاده کنید (توضیحاتش رو تو درس های قبل گفتیم) . تمام قوانین درس های قبل هم در مورد این ریجکس صدق میکنه .

مثال ها:

python123Guard-iran45 ==> \d+ ==> [123, 45]
python123Guard-iran45 ==> \d\d ==> [12, 34]
python123Guard-iran45 ==> \d{3} ==> [123]
python123Guard-iran45 ==> \d{1,10} ==> [123, 45]
python123Guard-iran45 ==> \d{1,2} ==> [12, 34, 5]
python123Guard-iran45 ==> \d{2} ==> [12, 34]

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

به مثالای زیر توجه کنید:

python123Guard-iran45 ==> python(\d+) ==> 123
python123Guard-iran45 ==> thon(\d+) ==> 123
python123Guard-iran45 ==> on(\d+) ==> 123
python123Guard-iran45 ==> n(\d+) ==> [123, 45]
python123Guard-iran45 ==> python\d+ ==> python123 بدون استفاده از پرانتز

اگه خوب دقت کرده باشید تو مثال اول عدد 45 در نظر گرفته نشده چون 45 بعد از کلمه iran اومده در صورتی که ما نوشتیم python . معنی ریجکس مثال اول میشه برو تو رشته کلمه python‌رو پیدا کن هر چی عدد بعدش بود نشون بده. برا همین عدد 45 نشون نداده چون اون بعد از کلمه iran اومده . به بقیه مثالا هم دقت کنید.

 

کاراکتر D\ . این کاراکتر به تنهایی بیانگر هر کاراکتری (حروف انگلیسی سمبل ها $ # و تمام علامت ها ) به غیر از اعداد هست . تمام قواعد مربوط به آکولاد ها و علامت + نیز برای این کاراکتر صدق میکنه. به مثالا خوب توجه کنید.

abcd1234Guard745 ==> \D ==> [a,b,c,d,G,u,a,r,d]
abcd1234Guard745 ==> \D+ ==> [abcd, Guard]
abcd1234Guard745 ==> \D\D ==> [ab,cd,Gu,ar]
abcd1234Guard745 ==> \D{2} ==> [ab,cd,Gu,ar]
abcd1234Guard745 ==> \D{2,5} ==> [abcd, Guard]
abcd1234Guard745 ==> \D{5} ==> Guard
abcd1234Guard745 ==> \D{10} ==> None چون کلمه 10 حرفی نداریم تو این رشته

توجه کنید که w\ هم عدد و هم حروف انگلیسی رو شامل میشه در صورتی که D\ تمام کاراکتر ها(اعم از سیمبل هایی مثل %$) رو شامل میشه و اعداد رو در نظر نمیگیره.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

در این درس با ریجکس نقطه . (دات) آشنا میشیم.

اگر این ریجکس به تنهایی استفاده شود به معنای یک حرف/عدد/سیمبل/کاراکتر های دیگر هست.یعنی شما اگر یک نقطه داخل ریجکس بذارید اون نقطه به تمام کاراکتر ها اشاره میکنه.حرف عدد علامت ها مثل ٪!* یا دیگر سیمبل ها و ...

مثال :

abc45gys%$@@ ==> . ==> a
@!yh12 ==> . ==> @
123sgdh ==> . ==> 1

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

خب ما قبلا علامت + رو با کاراکتر های دیگه امتحان کردیم تو اینجا هم همون نتیجه رو میده یعنی ریجکس +. به معنی این هست که : تمام کاراکتر ها (اعم از اعداد حروف سیمبل ها و ...) رو که در رشته وجود داره برام نمایش بده .

به مثالای زیر دقت کنید:

moj#$%$^&^*(&><MZ123 ==> .+ ==> moj#$%$^&^*(&><MZ123
guardiran ==> .+ ==> guardiran                                                

نکته : بجای علامت + از علامت * نیز میتوانید استفاده کنید تنها تفاوت این هست که اگر رشته مورد نظر ما خالی باشه (یعنی هیچی ننویسیم) + اونو نشون نمیده مثلا اگر ما بخوایم از ریجکس +d\ استفاده کنیم باید حداقل یه عدد تو رشته وجود داشته باشه و اگر هیچ عددی موجود نباشه بهمون در جواب میگه None . اما اگر از ریجکس *d\ استفاده کنیم و تو رشته هیچ عددی نباشه بهمون در جواب یه رشته خالی میده.

به مثالا دقت کنید:

Guardiran ==> \d+ ==> None
Guardiran ==> \d* ==> ''
'' ==> .* ==> ''
'' ==> .+ ==> None
guardiran ==> .* ==> guardiran

اخرین ریجکس این درس .\ هست که تو اینجا ما نقطه رو با بک اسلش \ ترکیب کردیم .

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

python123.ji ==> \. ==> .
python123.ji ==> \d+\. ==> 123.
python123.456moji ==> \d+\. ==> 123.
python123.456moji ==> \d+\.\d+ ==> 123.456
python. ==> \. ==> .
pyhton.123 ==> python\. ==> python.

تو این مثالا برای تمرین بیشتر من ریجکس d\ رو هم باهاش ترکیب کردم . حتما کار کنید.

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

درس امروز نسبت به درس های قبلی راحتتره و چیزی نداره .

تو این درس میخوایم با یکی از کاربردهای [ ] یعنی براکت ها آشنا بشیم. به عبارت دیگه میخوایم بررسی کنیم اگه ریجکس ها داخل براکت باشن چه اتفاقی میوفته یا اگر حرفی عددی علامتی داخل این براکت ها بذاریم به چه معنی هست.

خب وقتی شما چیزی داخل براکت میذارید یعنی مثلا [abc] دارید میگید : یا a یا b‌ یا c . یعنی یکی از این سه حرفی که من داخل براکت گذاشتم .

من یه چند تا کلمه دارم به این شکل:

can , man ,dan , ran , fan , pan

خب حالا سوال اینه : کلماتی رو از این رشته بیرون بکشید که فقط حروف اولشون یا c یا m یا f باشن

خب ببینید سوال گفته (یا) پس یکی از حروف c m f قابل قبوله و همانطور که میدونیم (یا) یعنی براکت پس داریم: [cmf]

حالا هنوز تموم نشده . کلماتی رو که صورت سوال خواسته حرف اولشون c یا m یا f هست اما بعدش دو حرف دیگم میخوایم یعنی an اگه به کلمات دقت کنید حرف دوم و سوم همشون یکیه یعنی همون an هست. پس جواب سوال میشه:

[cmf]an

در مقابل تعریف اولیه از براکت ها -  از علامت ^ استفاده میکنیم .

مثال :

[^dpr]an

علامت ^ همیشه قبل از اون چیز هاییه که داخل براکته . مفهوم [dpr^] این میشه که : حروف d یا r‌یا p رو در نظر نگیر پس وقتی این سه تارو در نظر نگیره فقط c و m و یا f میمونن . یعنی این دو تا ریجکسی که نوشتیم معادل همن .

[cmf]an ==> can, man, fan
[^dpr]an ==> can, man, fan

جواب ها یکیه

پس

[cmf]an == [^drp]an

دو تا کاربرد دیگه براکت رو تو درس بعدی میگیم که اونم سادست.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

کاربرد دیگری از براکت ها [] در ریجکس.

چند مثال میزنیم:

ریجکس [A-Z] داره میگه یکی از حروف انگلیسی بزرگ از A تا Z رو در نظر بگیر اگه درس قبل رو یادتون باشه مینوشتیم [cmf] که یعنی یا c‌یا m یا f . تو اینجا ما دیگه نمیخوایم بشینیم همه ی حروف الفبارو بنویسیم [abcdefgh...] بجاش مینویسیم [A-Z] یعنی به ترتیب از A تا Z یکی رو که تو رشته هست انتخاب کن. در حقیقت اینجا داریم میگیم یکی از حرف های انگلیسی که به ترتیب چیده شدن رو برام نشون بده. [a-z] هم که مشخصه برای حروف کوچیک.

مثال :

میخوایم کلمات Ana و Bob و Cpc  رو بکشیم بیرون از رشته زیر :

Cpc, Bob, aax, bby, Ana, ccz

اگه دقت کنید حرف اول این کلمات A , B , C و حروف بزرگ هستند . دومین حرفشون n o p هستند که باز هم به ترتیب حروف الفباست . سومین حرف هم a , b , c هست که بازم به ترتیب حروف الفباست . تا الان خیلی از ریجکس های اصلی رو یاد گرفتید میتونید با اونها اینارو بکشید بیرون ولی اگه بخوایم از روش درس امروز استفاده کنیم باید بنویسیم:

[A-C][n-p][a-c]

که تمام اون کلماتی که میخوایمو برامون نشون میده.

جواب های دیگه :

[ABC][nop][abc]
[^a-c][^a-c][^x-z]

اگه درس های قبل رو خونده باشید اینا رو تا الان فهمیدید.

نکته : ریجکس [_A-Za-z0-9] دقیقا معادل یک ریجکس w\ هست. معنیش هم میشه از بین تمام حروف الفبا هم بزرگ هم کوچک یا تمام اعداد 0 تا 9 یا آندرلاین (ـ) یکیش رو انتخاب کن .

   

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید دیدگاهی ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !

ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید

ورود به حساب کاربری