Python/re

من موسوعة حسوب

تقّدم الوحدة re مجموعة من العمليات الخاصة بمطابقة التعابير النمطية Regular Expressions وهي مشابهة إلى حدّ كبير للعمليات الموجودة في لغة Perl.

يمكن أن تكون الأنماط والسلاسل النصية المراد العثور عليها سلاسل نصية بترميز Unicode من نوع (str) أو سلاسل نصية ذات 8 بتات من نوع (bytes)، ولكن لا يجوز المزج بين النوعين، بمعنى أنّه لا يمكن مطابقة سلسلة نصية مع نمط من نوع البايتات والعكس صحيح أيضًا، وبنفس الطريقة، عند الرغبة في إجراء عملية استبدال يجب أن تكون سلسلة الاستبدال النصية من نوع واحد يطابق نوع كلّ من النمط وسلسلة البحث النصية.

تستخدم التعابير النمطية المحرف ('\') للإشارة إلى أشكال خاصة من الأنماط أو للسماح باستخدام الحروف الخاصة كما هي ودون تنفيذ وظيفته الخاصة، وتستخدم بايثون المحرف ذاته لأداء الوظيفة عينها في السلاسل النصية، الأمر الذي يؤدي إلى حدوث بعض الأخطاء، فعلى سبيل المثال لمطابقة الخط المائل العكسي يجب استخدام النمط '\\\\'، وذلك لأنّ التعبير النمطي يجب أن يكون '\\'، وفي الوقت ذاته يجب تمثيل كل خط مائل عكسي في السلاسل النصية الاعتيادية باستخدام '\\'.

ولحل مشكلة التضارب هذه يمكن استخدام السلاسل النصية الخام في بايثون، وهي السلاسل النصية التي تكون مسبوقة بالحرف r. لا تُعامل الخطوط المائلة العكسية في السلاسل النصية الخام معاملة خاصة، لذا فإنّ التعبير r"\n"‎ هو سلسلة نصية تتضمن حرفين هما '\' و 'n'، أما التعبير ‎"\n"‎ فهو سلسلة نصية تتضمن حرفًا واحدًا هو حرف السطر الجديد، ومن هنا اعتاد المطوّرون على استخدام السلاسل النصية الخام لكتابة الأنماط المستخدمة في التعابير النمطية.

من الضروري الانتباه إلى أنّ معظم العمليات الخاصة بالتعابير النمطية متوفّرة كدوالّ على مستوى الوحدة module-level functions ويمكن تطبيقها على التعابير النمطية المصرّفة. والدوالّ هي اختصارات لا تتطلب إجراء عملية التصريف على كائن regex في البداية، ولكنّها تفتقد بعض المعاملات التي تضبط أداء هذه الدوال.

دوال الوحدة re

تقدّم الوحدة re مجموعة الدوال التالية إضافة إلى استثناء واحد فقط:

الدالة re.compile()

تصرّف الدالة التعبير النمطي إلى كائن تعبير نمطي regex يمكن استخدامه للمطابقة بواسطة توابعه الخاصّة match()‎ و search() وغيرها.

الدالة re.search()

تفحص الدالة السلسلة النصية بحثًا عن أول موقع يحصل فيه تطابق مع التعبير النمطي المعطى، وتعيد كائن match المقابل.

الدالة re.match()

تفحص الدالة بداية السلسلة النصية بحثًا عن حالة تطابق مع التعبير النمطي المعطى، وتعيد كائن match المقابل.

الدالة re.fullmatch()

تتحقّق الدالة ممّا إذا كانت السلسلة النصية بأكملها مطابقة للتعبير النمطي المعطى.

الدالة re.split()

تقسم الدالة السلسلة النصية عند كل مكان تحدث فيه عملية مطابقة للنمط المعطى.

الدالة re.findall()

تعيد الدالة جميع حالات التطابق غير المتداخلة للنمط المطبق على السلسلة النصية المعطاة على هيئة قائمة من السلاسل النصية.

الدالة re.findeiter()

تعيد الدالة كائنًا قابلًا للتكرار iterator ينتج عنه كائنات match لجميع حالات التطابق غير المتداخلة والناتجة من تطبيق التعبير النمطي المعطى على السلسلة النصية المعطاة.

الدالة re.sub()

تبدل الدالة حالات التطابق غير المتداخلة في أقصى اليسار -والناتجة عن تطبيق التعبير النمطي المعطى على السلسلة النصية المعطاة- بسلسلة نصية أو بالقيمة المعادة من دالة.

الدالة re.subn()

تؤدي هذه الدالة نفس عمل الدالة re.sub()‎ ولكنّها تعيد الناتج على هيئة صفّ (السلسلة الجديدة، عدد الاستبدالات المجراة).

الدالة re.escape()

تهرّب الدالة جميع المحارف الخاصّة في التعبير النمطي المعطى باستثناء حروف الترميز ASCII، والأعداد والشرطة السفلية.

الاستثناء re.error()

تطلق اللغة هذا الاستثناء عند تمرير سلسلة نصية غير صالحة كتعبير نمطي إلى إحدى الدوال السابقة (كأن تتضمن السلسلة أقواسًا غير متطابقة)، أو عند حدوث أخطاء أخرى أثناء عملية التصريف أو المطابقة. لا يعد خلوّ السلسلة النصية من التطابقات خطأً على الإطلاق.

مصادر