/مقدمة إلي التعابير النمطية Regular Expressions

مقدمة إلي التعابير النمطية Regular Expressions

تستخدم التعابير النمطية Regular Expressions في الحوسبة لمعالجة النصوص ومحركات البحث search engines والبحث عن أنماط محددة في النصوص ، وتوجد تطبيقات لها في معظم لغات البرمجة .
في هذا المقال سنتعرف علي كيفية استخدامها مع لغة Python وطريقة الاستخدام متشابهة بنسبة كبيرة في باقي اللغات .

في البداية نقوم باستيراد المكتبة :
import re

وسنستخدم search() وهي دالة method في المكتبة تقوم بالتحقق من وجود النمط الذي أرسله لها وتأخذ معاملان (Two Parameters) الأول هو النمط الذي أبحث عنه والثاني نص وهو ما سأبحث فيه

re.search( ‘ Regular expression ’ , ‘text to search in’ )

 

سأستخدم هذا الملف النصي mbox-short.txt كمثال للبحث وبعد تحميله في نفس مكان البرنامج أريد البحث عن السطور التي تحتوي علي كلمة From ثم طباعتها وهذا الكود يقوم بالمهمة :

# Search for lines that start with From and have an at sign
import re
hand = open('mbox-short.txt') # to open the file
for line in hand: # loop through each line
    if re.search('From:', line) : # check if 'From' is in the line
        print line # print the line if then

 

يكون الناتج سطور تحتوي علي “From:” مثل :

From: cwen@iupui.edu

ماذا لو أردنا طباعة السطور التي تبدأ فقط بكلمة From وليس مجرد أن تحتويها

هنا يمكننا استخدام ” ^ ” والذي يعني بداية السطر أي أن السطر يجب أن يبدأ بالكلمة التي بعد الرمز ^ فيكون السطر رقم 5 هكذا :

if re.search('^From:', line) : # check if 'From' is the start of the line

 

مقابل هذا الرمز هو علامة الدولار ” $ ” والتي تعني أن السطر ينتهي بالكلمة السابقة للعلامة فمثلا لو أردنا البحث عن السطور التي تنتهي بكلمة “java” نغير السطر رقم 5 ليصبح هكذا :

if re.search('java$', line) # check if the line ends with “ java ”

 

يكون الناتج :

app/ui/src/java/org/sakaiproject/tool/gradebook/ui/RosterBean.java

أما رمز النقطة ” . ” فيمكن استبداله بأي حرف آخر ورمز الجمع” +”فيعني تكرار السابق له مرة أو عدة مرات بمعني لو جعلنا السطر الخامس :

if re.search('^X-.+:', line) : # matches any line start with X-followed by any number of characters then “:”

 

فسيبحث عن السطور التي تبدأ ب X- ثم متبوعة بأي حرف كان بشرط أن يتكرر مرة علي الأقل أو عدة مرات ثم يتبع هذه الحروف ” : ” فنجد الناتج :

X-DSPAM-Result: Innocent
X-DSPAM-Processed: Thu Jan 3 16:23:48 2008
X-DSPAM-Confidence: 0.9907
X-DSPAM-Probability: 0.0000

حسناً الدالة search كانت تعود بـ True or False ماذا لو أردنا إستخراج ما بحثنا عنه وتخزينه في مصفوفة مثلا بدون اللجوء للطرق التقليدية ؟ لهذا هناك دالة أخري وهى findall وتأخذ نفس معاملات search لكنها ترجع مصفوفة list بها النصوص المقتطفة والتي تشابه التعبير النمطي Regular expression الذي بحثنا به .
سأستخدم الطرفية terminal لإيضاح استخدام هذه الدالة

بالنسبة ل [0-9] فهو نمط يعني أي رقم من 0 إلي 9
وعموما فالأقواس المكعبة معناها أنك تريد حرفا واحدا من هذه الفئة.
تذكر: حرفا واحدا والصورة الآتية توضح الأمر :

نلاحظ أنه استخرج dog و dig و dmg ولم يستخرج djg ولا dug لأننا لم نضع j و u داخل الأقواس المكعبة .
عند استخدم الرمز ^ داخل الأقواس المكعبة فهذا يعني أي حرف باستثناء الحروف القادمة مثلا :

وهذا عكس السابق بالضبط
ماذا لو استخدمت [0-9]+ هذا يعني ابحث عن الأرقام من 0 إلي 9 إذا تكررت بجانب بعضها مرة أو أكثر

وأخيرا هذه بعض الرموز الأخري التي قد تحتاجها مع وصف بسيط لها :

عالم ال Regular Expressions كبير ويمكنك من البحث في النصوص بشكل سريع وبكفاءة عالية
وهذا كان استعراضا بسيطا لبعض ما يمكنك تنفيذه .

المصادر:

1 2 3