محمداحمد

لائبریرین
Regular Expression

ریگولر ایکسپریشن (Regular Expression) کے ذریعے ہم مخصوص نمونے (Pattern) کے عبارتی ٹکڑوں کو کسی بڑی عبارت میں سے شناخت کر سکتے ہیں۔ نہ صرف شناخت کرسکتے ہیں بلکہ شناخت کے بعد ممکنہ تدوین کا کام بھی ہوسکتا ہے۔ گو کہ یہ سب کام عمومی طور پر اسٹرنگ کے طریقہ کار سے بھی کسی حد تک ممکن ہے لیکن ریگولر ایکسپریشن نمونے کے اعتبار (Pattern based) عبارت نکال کر دینے کے لئے بطورِ خاص استعمال ہوتا ہے۔

پائتھون میں ریگولر ایکسپریشن (Regular Expression) کا ایک ماڈیول re کے نام سے موجود ہے۔ باقی گفتگو اسی ماڈیول سے متعلق رہے گی۔

Regular Expression|Start and End Line
Regular Expression|Number Validation
Regular Expression|Word Boundary
Regular Expression|Search and Replace
Regular Expression|Verbose
 

محمداحمد

لائبریرین
ریگولر ایکسپریشن کے پیٹرنز کی عمومی علامات:​

re_amended_zps5052ad5c.jpg
 

محمداحمد

لائبریرین
درج ذیل کوڈ بغور دیکھیے:

PHP:
>>> import re
سب سے پہلے Python re Module کو امپورٹ کیا گیا۔ اب نیچے دی گئی مثالیں دیکھیے۔

پہلی مثال
PHP:
>>> text = "This is a car"
>>> regexp = re.compile(r'car')
>>> if re.search(regexp, text):
    print ("Match found")
 
 
Match found
>>>

دوسری مثال
PHP:
>>> text = "This is a car"
>>> regexp = re.compile(r'bike')
>>> if re.search(regexp, text):
    print ("Match found")
 
   
>>>

اس کوڈ میں ایک ویری ایبل text کو ایک جملہ تفویض (assign) کیا گیا ہے۔ پھر ایک اور ویری ایبل regexp کو re.compile کے تحت ایک عبارتی نمونہ (Text Pattern) تفویض کیا گیا ہے۔ بعد میں search method کی مدد سے ویری ایبل text میں regexp کو تفویض کردہ عبارتی نمونہ تلاش کیا گیا ہے۔ جو ہماری پہلی مثال میں مل گیا ہے اور دوسری مثال میں نہیں مل سکا ہے۔

re.compile ایک عبارتی نمونے ( Text Pattern ) کو ایک ریگولر ایکسپریشن آبجیکٹ میں تبدیل کرتا ہے جو بعد ازاں search یا match کے طریقہ کار کی مدد سے کسی عبارت سے مماثل عبارتی ٹکڑوں کو شناخت کرنے کا کام انجام دیتا ہے۔

re.compile میں دیے گئے عبارتی نمونے (Text Pattern ) میں موجود r کا کیرکٹر بھی وضاحت کا متقاضی ہے۔ جس طرح پائتھون میں Character Sequences ہوتی ہیں (مثلا n\ اور t\ وغیرہ) اسی طرح پائتھون ریگولر ایکسپریشن ماڈیول کے بھی اپنے Character Sequences ہوتے ہیں۔ جو کہیں کہیں پائتھون کے Character Sequencesکے مماثل اور کہیں کہیں مختلف بھی ہیں۔ پائتھون اور ریگولر ایکسپریشن کے Character Sequences کے مابین ممکنہ تصادم (conflict) کے خوف سے ہم عبارتی نمونے سے پہلے r کا کیرکٹر لگا دیتے ہیں جس سے مراد یہ ہوتی ہے کہ r کے بعد آنے والا عبارتی نمونہ عبارت کی خام شکل میں ہوگا یعنی یہ String ایک Raw String ہوگا۔ Raw String میں Character Sequences بھی اپنی اصل شکل میں پڑھے جاتے ہیں۔

چونکہ ہماری پہلی مثال میں لفظ car کو تلاش کیا گیا ہے جو ہماری عبارت میں موجود ہے تو پہلی مثال کا نتیجہ مثبت رہا ہے۔ جب کہ دوسری مثال میں لفظ bike تلاش کیا گیا ہے جو ہماری عبارت میں موجود نہیں ہے۔ نتیجتاً ہمیں کوئی جواب نہیں مل سکا ہے۔
 

محمداحمد

لائبریرین
ریگولر ایکسپریشن پر عمومی تجربات کے لئے ہم نے ایک چھوٹا سا فنکشن بنا لیا ہے جس کی مدد سے ہمیں مختلف عبارتی نمونوں کی جانچ میں آسانی ہوگی۔ فنکشن کا کوڈ درج ذیل ہے۔

PHP:
def find_re(pattern,string):
    import re
    regexp = re.compile(pattern)
    if re.search(regexp, string):
        print ("Pattern found")
    else:
        print ("Nothing found")

فنکشن کا نام find_re ہے اور یہ دو پیرامیٹرز لیتا ہے جن میں ایک میں کا عبارتی نمونہ (Text Pattern) ہے جبکہ دوسرے پیرامیٹر میں ٹیکسٹ اسٹرنگ لیا جائے گا۔

فنکشن میں سب سے پہلے ہم نے re ماڈیول کو import کروایا ہے ۔ اور پھر re.compile کی مدد سے پیٹرن کو ایک ویری ایبل regexp میں بطور ریگولر ایکسپریشن ٹیکسٹ پیٹرن محفوظ کروایا ہے۔ اس کے بعد re.search کی مدد سے دی گئی عبارت سے نمونے کا ٹیکسٹ تلاش کیا گیا ہے۔ آخر میں if بیان کی مدد سے تلاش کردہ عبارتی نمونہ (Text Pattern)کے دی گئی عبارت میں ہونے یا نہ ہونے کی بنیاد پر ایک اسٹیٹمنٹ پرنٹ کروایا گیا ہے۔
 

محمداحمد

لائبریرین
درج ذیل مثالوں کو بغور دیکھیے:

PHP:
# EXAMPLE 1
>>> text1 = "Hello! This is Ahmed. Say hello when you see any of your friend."
>>> find_re(r'hello',text1)
Pattern found
>>>
>>>
 
# EXAMPLE 2
 
>>> text2 = "Hello! This is Ahmed. Say Hello when you see any of your friend."
>>> find_re(r'hello',text2)
Nothing found
>>>
 
# EXAMPLE 3
 
>>> text2 = "Hello! This is Ahmed. Say Hello when you see any of your friend."
>>> find_re(r'[Hh]ello',text2)
Pattern found
>>>
 
# EXAMPLE 4
 
>>> text3 = "Python and Pearl are programming languages"
>>> find_re(r'P[ython|earl]',text3)
Pattern found
>>>

پہلی مثال میں ہم نے ایک ٹیکسٹ 'hello' تلاش کیا ہے جو کہ text1 میں موجود ہے۔ اس لئے ہمیں مثبت جواب ملا ہے۔

دوسری مثال میں بھی ہم نے ٹیکسٹ 'hello' تلاش کیا ہے لیکن ہماری عبارت text2 میں لفظ 'hello' موجود نہیں ہے بلکہ یہاں موجود 'Hello' میں H بڑا (Capital) ہے۔ یہی وجہ ہے کہ ہمیں یہاں جواب نفی میں ملا ہے۔

تیسری مثال میں ہم نے عبارتی نمونے (Text Pattern) میں کچھ تبدیلی کی ہے جو اب کچھ یوں '[Hh]ello' ہو گیا ہے۔ یعنی ہم نے [] بریکٹس کی مدد سے اختیاری طور پر چھوٹے (lowercase) اور بڑے (uppercase) کیرکٹرز کو شامل کر دیا۔ اب ہمارا ٹیکٹسٹ پیٹرن دونوں طرح کے 'Hh' کو قبول کرے گا ۔ اس مثال میں بھی جواب مثبت ہے۔ کیوں یہ آپ کی سمجھ آ ہی گیا ہوگا۔

چوتھی مثال کا عبارتی نمونہ (Text Pattern) بھی تیسری مثال کی مانند ہے اور اس میں میں کیرکٹر 'P' کے ساتھ اختیاری طور پر دو الفاظ Python اور Pearl کے باقی ماندہ (P کے علاوہ) کو شامل کیا گیا ہے۔ اس کا نتیجہ بھی مثبت ہے۔
 

محمداحمد

لائبریرین
ریگولر ایکسپریشن اور ہندسے

ہندسوں کے لئے ریگولر ایکسپریشن میں \d کا استعمال کیا جاتا ہے جب کہ ہندسوں کے علاوہ دیگر کیرکٹرز کی شناخت کے لئے \D کا استعمال ہوتا ہے۔

درج ذیل مثال میں ہم ایک درست (valid) رول نمبر کو شناخت کریں گے۔ ہماری مثال میں ایک درست (valid) رول نمبر 4 ہندسوں پر مبنی ہوگا۔ یعنی ہمیں کوئی بھی رول نمبر صرف اس شرط میں قبول کرنا ہوگا جب وہ 4 ہندسوں پر مبنی ہو (نہ اس سے کم اور نہ اس سے زیادہ)۔

PHP:
>>> ab = '121'
>>> cd = '2554'
>>> ef = '14475'
>>> gh = '98'
>>>
>>> find_re(r'^(\d{4})$',ab)
Nothing found
>>> find_re(r'^(\d{4})$',cd)
Pattern found
>>> find_re(r'^(\d{4})$',ef)
Nothing found
>>> find_re(r'^(\d{4})$',gh)
Nothing found

ہماری مثال میں چار مختلف متغیرات (variables) کو مختلف رول نمبر (ہندسے) تفویض کئے گئے ہیں۔ ان رول نمبرز کو ہم نے اپنے ریگولر ایکسپریشن والے فنکشن کے تحت جانچا تو پتہ چلا کہ صرف متغر cd ہی ایسا رول نمبر ہے جو ہمارے درست رول نمبر کے معیار پر پورا اُترتا ہے۔ یعنی اس میں چار ہندسے دیے گئے ہیں۔ اس کے برعکس دیگر متغیرات میں یا تو رول نمبر میں دیئے گئے ہندسے چار سے کم ہیں یا چار سے زیادہ۔

اب ذرا بات ہوجائے عبارتی نمونے (Text Pattern) کی۔ ہمارا عبارتی نمونہ کچھ یوں ہے '^(\d{4})$' ۔

کیرٹ سائن (^) سطر کی ابتدا کی نشاندہی کرتا ہے جبکہ ڈالر سائن ($) سطر کے اختتام کی۔ ہندسوں کی شناخت کے لئے \d استعمال کیا گیا ہے۔ یعنی ہمارے مطلوبہ کیرکٹرز صرف ہندسے ہوں گے۔ اس کے بعد لہریے دار بریکٹ { } میں 4 کا ہندسہ موجود ہے۔ جس سے مراد یہ ہے کہ ہمارے مطلوبہ ٹیکسٹ میں صرف چار ہندسے ہوں گے (کم نہ زیادہ)۔

مزید کچھ مثالیں دیکھیے:
PHP:
>>> find_re(r'^(\d{3,})$',ab)
Pattern found
>>> find_re(r'^(\d{3,})$',cd)
Pattern found
>>> find_re(r'^(\d{3,})$',ef)
Pattern found
>>> find_re(r'^(\d{3,})$',gh)
Nothing found
>>>

یہاں ہم نے اپنے عبارتی نمونے میں 3 کے بعد ایک عدد کامہ (،) ڈال دیا ہے جس سے مراد یہ ہے کہ ہمارا مطلوبہ رول نمبر وہ ہے جس میں کم از کم 3 ہندسے ہوں، زیادہ سے زیادہ کی کوئی حد مقرر نہیں کی گئی۔ اب آپ دیکھ سکتے ہیں کہ متغیر gh کے سوا سب ہمارے (نئے) معیار پر پورے آگئے ہیں۔ کیونکہ gh میں صرف دو ہندسے موجود ہیں۔

کچھ اور مثالیں:
PHP:
>>> find_re(r'^(\d{0,3})$',ab)
Pattern found
>>> find_re(r'^(\d{0,3})$',cd)
Nothing found
>>> find_re(r'^(\d{0,3})$',ef)
Nothing found
>>> find_re(r'^(\d{0,3})$',gh)
Pattern found
>>>

اب ہم نے عبارتی نمونے میں ہندسوں کی کم از کم حد 0 اور زیادہ سے زیادہ 3 مقرر کی ہے۔ مثالیں اور اُن کے نتائج سے اس بات کا بخوبی اندازہ ہو جاتا ہے۔
 
Top