Programming Basics SQL HTML CSS JavaScript React Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Linux Learn Typing

بايثونالتعابير النمطية

  • مفهوم التعابير النمطية
  • دوال الموديول re
  • الأحرف المميزة
  • وضع set من الإحتمالات
  • السلاسل المميزة
  • الكائن Match

مفهوم التعابير النمطية

التعابير النمطية ( Regular Expressions ) عبارة عن نصوص تحتوي على أحرف و رموز لها معاني محددة.
للدقة أكثر، كل حرف أو رمز نضعه في هذا النص يعني شيء معين.

نستخدم التعابير النمطية للبحث في النصوص بطريقة سهلة جداً بدل الحاجة إلى كتابة خوارزميات معقدة من أجل الوصول إلى النتيجة المرجوة. و بالتالي يمكنك إستغلال التعابير النمطية في حال أردت البحث في النص عن شيء محدد بهدف إجراء تعديل أو تحديث عليه.

عندما تقوم بإنشاء حساب في أي موقع إلكتروني يُطلب منك إدخال بريدك الإلكتروني و كلمة سر. عندها أثناء كتابة البريد الإلكتروني و كلمة المرور تجده يظهر لك تنبيهات في حال لم تقم بإدخال بريد إلكتروني صحيح أو كلمة سر لها شكل معين. فمثلاً تجد أنه يطلب منك وضع كلمة سر تتألف من ثمانية أحرف على الأقل و يجب أن تحتوي على حرف كبير, حرف صغير, رقم و رمز.


التعامل مع التعابير النمطية

re هو موديول جاهز في بايثون يحتوي على دوال و ثوابت جاهزة مخصصة للتعامل مع التعابير النمطية. لهذا يجب تضمينه عند الحاجة إلى استخدام التعابير النمطية.

لتضمين الموديول re نكتب السطر التالي.

import re

دوال الموديول re

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

إسم الدالة مع تعريفها
1 search(pattern, string, flags=0) تبحث في النص الذي نمرره لها مكان الباراميتر string لترى ما إذا كان يتطابق أو فيه جزء يتطابق مع التعبير النمطي الذي نمرره لها مكان الباراميتر pattern.
في حال تم إيجاد جزء أو أكثر في النص يتطابق مع التعبير النمطي, تقوم بإرجاع كائن من الكلاس Match يحتوي على معلومات أول مكان في هذا النص تطابق مع التعبير النمطي.
في حال لم يتم العثور على النص المراد البحث عنه ترجع None.
شاهد مثال
2 findall(pattern, string, flags=0) تبحث في النص الذي نمرره لها مكان الباراميتر string لترى ما إذا كان يتطابق أو فيه جزء يتطابق مع التعبير النمطي الذي نمرره لها مكان الباراميتر pattern.
في حال تم إيجاد جزء أو أكثر في النص يتطابق مع التعبير النمطي، ترجع list كل عنصر فيه يمثل الجزء الذي يتطابق مع التعبير النمطي.
في حال لم يتم إيجاد أي تطابق، ترجع list فارغ.
شاهد مثال
3 finditer(pattern, string, flags=0) تبحث في النص الذي نمرره لها مكان الباراميتر string لترى ما إذا كان يتطابق أو فيه جزء يتطابق مع التعبير النمطي الذي نمرره لها مكان الباراميتر pattern.
في حال تم إيجاد جزء أو أكثر في النص يتطابق مع التعبير النمطي، ترجع iterator كل عنصر فيه عبارة عن كائن Match يمثل الجزء الذي يتطابق مع التعبير النمطي.
في حال لم يتم إيجاد أي تطابق، ترجع list فارغ.
شاهد مثال
4 split(pattern, string, maxsplit=0, flags=0) ترجع نسخة من النص الذي نمرره لها مكان الباراميتر string مقسمة على شكل list من النصوص.
مكان الباراميتر pattern نمرر تعبير نمطي يحدد الطريقة التي سيتم على أساسها تقسيم النص و وضع كل قسم فيه في عنصر واحد بداخل المصفوفة.
في حال لم يتم العثور على النص المراد البحث عنه ترجع list فيه عنصر واحد يحتوي على كل النص الذي تم البحث فيه.
مكان الباراميتر maxsplit يمكنك تمرير رقم يحدد إلى كم قسم تريد أن يتم تقسيم النص.
شاهد مثال
5 sub(pattern, repl, string, count=0, flags=0) ترجع نسخة من النص الذي نمرره لها مكان الباراميتر string مع تبديل كل جزئية فيها تتطابق مع التعبير النمطي الذي نمرره لها مكان الباراميتر pattern بالنص الذي نمرره لها مكان الباراميتر repl.
مكان الباراميتر count يمكنك تمرير رقم أكبر من صفر يمثل أول كم جزئية يتم العثور عليها تريدها أن تتبدل.
شاهد مثال

الأحرف المميزة

الأحرف المميزة ( Special Characters ) عبارة عن رموز لها معنى خاص و لقد ذكرناهم في الجدول التالي.

الرمز إستخدامه
^ يستخدم للتشييك على الأحرف الموضوعة في بداية كل سطر في النص.

مثال: "^Hello"
هذا التعبير يقصد منه هل النص أو كل سطر فيه يبدأ بكلمة Hello.
شاهد مثال
$ يستخدم للتشييك على الأحرف الموضوعة في نهاية كل سطر في النص.

مثال: "World$"
هذا التعبير يقصد منه هل النص أو كل سطر فيه ينتهي بكلمة World.
شاهد مثال
. يستخدم للإشارة إلى وجوب وجود أي حرف ما عدا الحرف \n الذي يشير إلى نهاية السطر.

مثال: "He..o"
هذا التعبير يقصد منه هل يوجد He و بعده حرفين، ثم حرف o.
شاهد مثال
+ يستخدم لمعرفة ما إذا كان الحرف الموضوع قبله موجود مرة واحدة على الأقل في النص.

مثال: "ello+"
هذا التعبير يقصد منه هل يوجد ell و بعده يوجد حرف o أو أكثر.
شاهد مثال
* يستخدم في حال عدم الإكتراث ما إذا كان الحرف الموضوع قبله موجود مرة، عدة مرات أو غير موجود على الإطلاق في النص.

مثال: "ello*"
هذا التعبير يقصد منه هل يوجد ell و لا يهم إذا كان يوجد بعده حرف o أو أكثر.
شاهد مثال
? يستخدم لمعرفة ما إذا كان الحرف الموضوع قبله موجود مرة واحدة أو غير موجود في النص.

مثال: "ai?"
هذا التعبير يقصد منه هل يوجد a و قد يوجد بعده حرف i.
شاهد مثال
| يستخدم لمعرفة ما إذا كان النص الموضوع قبله أو النص الموضوع بعده موجود في النص.

مثال: "Hello|Hi"
هذا التعبير يقصد منه هل يوجد Hello أو Hi.
شاهد مثال
{m} يستخدم لمعرفة ما إذا كان الحرف الموضوع قبله موجود في النص عدد محدد من المرات.
مكان الحرف m نمرر عدد المرات.

مثال: "al{2}"
هذا التعبير يقصد منه هل يوجد a يليه حرفين l.
شاهد مثال
{m,n} يستخدم لمعرفة ما إذا كان الحرف الموضوع قبله موجود في النص عدد مرات محصور بين عددين.
مكان الحرف m نمرر عدد المرات الأقل، و مكان الحرف n نمرر عدد المرات الأكثر.

مثال: "al{1, 2}"
هذا التعبير يقصد منه هل يوجد a يليه حرف أو حرفين l.
شاهد مثال

وضع set من الإحتمالات

القصد هنا هو أن تضع الرمز [] و بداخله تمرر مجموعة من الأحرف و الرموز الأخرى كما فعلنا في الجدول التالي.

الرمز إستخدامه
[abc] هذا التعبير يقصد منه هل يوجد في النص الحرف a أو b أو c.
شاهد مثال
[^abc] هذا التعبير يقصد منه هل يوجد في النص أي حرف غير الأحرف a و b و c.
شاهد مثال
[a-f] هذا التعبير يقصد منه هل يوجد في النص أحد الأحرف الأبجدية الموجودة بين الحرف a و الحرف f.
هنا كأننا قلنا: [abcdef].
شاهد مثال
[0123] هذا التعبير يقصد منه هل يوجد في النص الرقم 0 أو 1 أو 2 أو 3.
شاهد مثال
[0-9] هذا التعبير يقصد منه هل يوجد في النص أحد الأرقام الموجودة بين الرقم 0 و الرقم 9.
هنا كأننا قلنا: [0123456789].
شاهد مثال
[0-5][0-9] هذا التعبير يقصد منه هل يوجد في النص أي عدد بين 00 و 59.
شاهد مثال
[a-zA-Z] هذا التعبير يقصد منه هل يوجد في النص أحد الأحرف الأبجدية الموجودة بين a و z، أو الموجودة بين A و Z.
أي كأننا نحاول معرفة ما إن كان يوجد أي حرف من الأحرف الأبجدية سواء كان الحرف كبير ( Capital Letter ) أو صغير ( Small Letter ).
شاهد مثال
[+] هذا التعبير يقصد منه هل يوجد في النص الرمز +.
أي هذا الرمز يعامل هنا كأنه حرف عادي و هذا الأمر ينطبق على باقي الرموز الأخرى مثل *, ., |, $, ), (, {, }.
شاهد مثال
[a\-z] هذا التعبير يقصد منه هل يوجد الحرف a أو الرمز - أو الحرف z في النص.
إذاً هنا الرمز \ يجعل الحرف الذي يوضع بعده يعامل كأنه حرف عادي و ليس رمز له معنى خاص.
شاهد مثال
[a-]
[-a]
كلا التعبيرين يقصد منهما هل يوجد الحرف a أو الرمز - في النص.
إذاً عند عدم وضع الرمز - بين حرفين أو رقمين فإنه يعامل كأنه حرف عادي و ليس رمز له معنى خاص.
شاهد مثال
[^^] هذا التعبير يقصد منه هل يوجد في النص أي حرف أو رمز ما عدا الرمز ^.
شاهد مثال

السلاسل المميزة

السلاسل المميزة ( Special Sequences ) عبارة عن مجموعة أحرف يصبح لها معنى خاص حين يتم وضعها بعد الرمز \ و لقد ذكرناهم في الجدول التالي.

الرمز إستخدامه
\w يطابق أي حرف بين a-z أو A-Z أو أي رقم بين 0-9 أو الرمز _.
هذا الرمز يعتبر إختصار للتعبير النمطي [a-zA-Z0-9_].
شاهد مثال
\W يطابق أي أحرف ليس بين a-z أو A-Z أو رقم أو الرمز _.
هذا الرمز يعتبر إختصار للتعبير النمطي [^a-zA-Z0-9_].
شاهد مثال
\d يطابق أي حرف يمثل رقم بين 0 و 9.
هذا الرمز يعتبر إختصار للتعبير النمطي [0-9].
شاهد مثال
\D يطابق أي أحرف لا يمثل رقم بين 0 و 9.
هذا الرمز يعتبر إختصار للتعبير النمطي [^0-9].
شاهد مثال
\s يطابق أي حرف يمثل مسافة فارغة.
هذا الرمز يعتبر إختصار للتعبير النمطي [ \t\n\r\f\v].
شاهد مثال
\S يطابق أي حرف لا يمثل مسافة فارغة.
هذا الرمز يعتبر إختصار للتعبير النمطي [^ \t\n\r\f\v].
شاهد مثال
\Z يطابق أي سلسلة أحرف نمررها قبله مع الأحرف الموجودة في نهاية النص.
شاهد مثال
\A يطابق أي سلسلة أحرف نمررها بعده مع الأحرف الموجودة في بداية النص.
شاهد مثال
\b يطابق أول أو آخر أي سلسلة أحرف تحتوي على أحرف بين a-z أو A-Z أو أي رقم بين 0-9 أو الرمز _.
  • في حال تم وضع التعبير في آخر سلسلة الأحرف فإنه يبحث عن تطابق موجود في آخر كل سلسلة أحرف غير مقطوعة بمسافة فارغة في النص.
  • في حال تم وضع التعبير في أول سلسلة الأحرف فإنه يبحث عن تطابق موجود في أول كل سلسلة أحرف غير مقطوعة بمسافة فارغة في النص.
شاهد مثال
\B لا يطابق أول أو آخر أي سلسلة أحرف تحتوي على أحرف بين a-z أو A-Z أو أي رقم بين 0-9 أو الرمز _.
  • في حال تم وضع التعبير في آخر سلسلة الأحرف فإنه يبحث عن تطابق غير موجود قبل آخر كل سلسلة أحرف غير مقطوعة بمسافة فارغة في النص.
  • في حال تم وضع التعبير في أول سلسلة الأحرف فإنه يبحث عن تطابق غير موجود بعد أول كل سلسلة أحرف غير مقطوعة بمسافة فارغة في النص.
شاهد مثال

الرمز \ يسمى Backslash و هو يقال له حرف هروب ( Escape Character فهو يستخدم للبحث في النص عن أشياء محددة كما سبق و رأينا.

في حال كنت تريد البحث عن الرمز \ نفسه فعليك معرفة أن مفسّر لغة بايثون يرا كل رمز \ كرمزين، أي يراه \\. بالتالي سيكون عليك وضع \\\\ إذا أردت البحث عن الرمز \ بحد ذاته.

إذا لم ترد فعل ذلك فيمكنك ببساطة إعتماد أسلوب Raw String، أي تضع الحرف r قبل التعبير النمطي مباشرةً كالتالي r"\Bea".
طبعاً كنت تستطيع كتابة التعبير السابق هكذا أيضاً "\\Bea".

في النهاية، ننصحك باعتماد أسلوب الـ Raw String لأنه أسهل و أقل تعقيداً.

الكائن Match

الكائن Match الذي ترجعه بعض دوال الموديول re يوفر لك أيضاً أربع دوال أساسية للتعامل مع المعلومات التي يحتويها.

إسم الدالة مع تعريفها
1 group() ترجع سلسلة الأحرف التي تم إيجادها في النص و التي تم تخزينها في كائن الـ Match الذي قام باستدعائها.
2 start() ترجع عدد صحيح يمثل Index أول حرف في سلسلة الأحرف التي تم إيجادها في النص و التي تم تخزينها في كائن الـ Match الذي قام باستدعائها.
3 end() ترجع عدد صحيح يمثل Index آخر حرف في سلسلة الأحرف التي تم إيجادها في النص و التي تم تخزينها في كائن الـ Match الذي قام باستدعائها.
4 span() تم تخزينها ترجع tuple يمثل أين تم إيجاد سلسلة الأحرف التي تم تخزينها في كائن الـ Match الذي قام باستدعائها.
هذا الـ tuple يحتوي على عددين فقط. العدد الأول يمثل Index أول حرف وجد عنده التطابق، العدد الثاني يمثل Index آخر حرف وجد عنده التطابق.

فيما يلي مثال شامل إستخدامنا فيه الدوال الأربعة المذكورة في الجدول.

شاهد مثال