تقنية

مجموعة يكررها التعبير النمطي: هل تعيد كل ما التقطته؟

رسم يقارن المطابقة الكاملة وآخر التقاط وبحثا آخر للوحدات في سطر مؤلف.
رسم تحريري أصلي لتفسير يدوي؛ ليس نتيجة تشغيل Python.

قد يقترح المساعد تعبيرا نمطيا ثم يقول إن المجموعة الأولى تحمل كل الرموز التي تكررت فيه. في Python re، هذا الاستنتاج لا يتبع من تكرار المجموعة داخل مطابقة واحدة. نقرأ عقد group وfindall، ونؤلف سطرا قصيرا يوضح فرق النص الكامل من آخر التقاط، دون تنفيذ الشفرة.

الخلاصة السريعة

لا؛ group لمجموعة تكررت داخل المطابقة يعيد آخر التقاط لها. افصل ذلك عن المطابقة الكاملة وعن بحث آخر يعيد كل الوحدات المطلوبة.

  • تبين وثيقة Python أن group(0) يعيد المطابقة كاملة، وأن مجموعة تكررت تعيد آخر التقاط؛ findall يعيد المطابقات غير المتداخلة وفق نمطه ومجموعاته. [1]
  • في مثال R2R5 والنمط (R[0-9])+، المطابقة الكاملة هي R2R5، وآخر التقاط للمجموعة الأولى R5؛ لا يصبح R2 غير موجود في الأصل.
  • طلب الوحدتين R2 وR5 يختلف عن طلب مجموعة داخل مطابقة كاملة؛ نختار في التمرين النمط بلا مجموعة R[0-9] لبحث غير متداخل في ترتيب النص.
  • احفظ الأصل والنمط والدالة ورقم المجموعة؛ لا تسم حقلا واحدا قائمة شاملة، ولا نحول رمز بطاقة إلى كيان واقعي أو نزعم تنفيذ Python.

ما دور المجموعة والدالة؟

توضح وثيقة Python أن group(0) يعيد المطابقة كاملة، وأن group لمجموعة تكررت يعيد آخر التقاط لها. وتصف findall بإرجاع المطابقات غير المتداخلة، مع اختلاف شكل النتيجة بحسب مجموعات النمط. [1]

إذن لا نقرأ كلمة «مطابقة» وحدها بوصفها جوابا عن كل سؤال استخراج. نحتاج معرفة هل المطلوب النص الذي وافق النمط كله أم قيمة مجموعة داخله، أو قائمة من مطابقات بحث آخر. هذه الأدوار تظل مختلفة حتى لو استخدمت الحروف نفسها في النمط.

كيف يظهر الفرق في سطر قصير؟

نؤلف السطر R2R5 والنمط (R[0-9])+، ونفترض تطبيق المطابقة على السطر كله. الجزء R[0-9] يصف حرف R ثم رقما واحدا من الأرقام المحددة، وتكراره يسمح بالوحدتين المتتابعتين في مثالنا. النص الموافق للنمط كله هو R2R5.

أما طلب المجموعة الأولى من هذه المطابقة المتكررة فيعطي آخر التقاط R5 وفق العقد الذي قرأناه. لا نستنتج أن R2 حذف من السطر، أو أن البطاقة لا تحمل إلا R5. الفرق في الحقل المطلوب من المطابقة؛ المثال تفسير يدوي لعقد معروف، وليس سجل تشغيل.

كيف نطلب قائمة الوحدات؟

إذا كانت المهمة استخراج كل وحدة R ثم رقم في تمريننا، نعلن بحثا مختلفا بالنمط R[0-9]، دون مجموعة ملتقطة فيه. وفق تعريف findall، المطابقتان غير المتداخلتين بالترتيب هما R2 ثم R5. هذه قائمة لمطابقات نمط آخر، لا تاريخ تلقائي لالتقاطات المجموعة السابقة.

قد يتغير المطلوب إذا كانت الوحدة رقما متعدد الخانات أو صورة كتابة أخرى؛ لا نعمم نمط الرقم الواحد على كل بطاقة. كذلك إضافة مجموعات إلى نمط البحث تغير تفسير ما يعاد. لذلك يحدد المساعد وحدة المهمة قبل أن يصف قيمة المجموعة بأنها جميع النتائج.

ماذا نحتاج لمراجعة الاستخراج؟

نقترح حفظ السطر الأصلي والنمط ونوع العملية والحقل الذي قُرئ، ثم مقارنة الناتج بوحدات المهمة المعلنة. إذا أعطيت للمراجع R5 وحدها دون هذه المعلومات، لا يستطيع استنتاج أن بقية المادة غير موجودة أو أنها كانت خارج نطاق البحث.

والرموز هنا بطاقات مؤلفة؛ لا تثبت وجود شخص أو ملف يطابقها في الواقع. لم نستدع re أو نجرب أداء نمط على مجموعة بيانات. أوضحنا كيف يختلف سؤال «ما آخر التقاط؟» عن «ما النص المطابق كله؟» و«ما قائمة الوحدات؟»، ليبقى كل جواب مرتبطا بعقده.

المصادر ومتابعة القراءة

  1. Python re: المجموعة المتكررة والمطابقات (يفتح في نافذة جديدة)docs.python.org

أُعدّ هذا المقال بصياغة عربية أصلية بالاستناد إلى المصادر أعلاه، وهو مدخل تمهيدي إلى الموضوع. اقرأ منهجية المحتوى وحدوده.