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

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

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

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

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


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

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

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

import re
	

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

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

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

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

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

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

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

مثال: "World$"
هذا التعبير يقصد منه هل النص أو كل سطر فيه ينتهي بكلمة Hello.
شاهد المثال »
. يستخدم للإشارة إلى وجوب وجود أي حرف ما عدا الحرف /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 يوفر لك أيضاً أربع دوال أساسية للتعامل مع المعلومات التي يحتويها.

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

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

شاهد المثال »

الدورات

أدوات مساعدة

أقسام الموقع

دورات
مقالات كتب مشاريع أسئلة