تستخدم التعابير النمطية 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 كبير ويمكنك من البحث في النصوص بشكل سريع وبكفاءة عالية
وهذا كان استعراضا بسيطا لبعض ما يمكنك تنفيذه .
المصادر:
Nice article, go ahead ahmed 🙂
thank you 😀