0% found this document useful (0 votes)
131 views75 pages

بايثون 2

Uploaded by

mustapha skander
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
131 views75 pages

بايثون 2

Uploaded by

mustapha skander
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 75

‫السالسل الرمزية (‪ )Strings‬في لغة بايثون‬

‫سبق ان تم التطرق الى اساسيات التعامل مع السالسل الرمزية للغة بايثون في الدرس الخامس الذي يمكن زيارته‬

‫من هنا‪.‬‬

‫اما اليوم فسنتكلم بشيء من التفصيل عن كيفية التعامل مع السالسل الرمزية ألهميتها في التعامل مع النصوص في‬

‫الملفات النصية وحتى في ملفات الوسائط المتعددة وكبداية بسيطة تعرف السلسلة الرمزية (‪ )String‬في كل لغات‬

‫البرمجة على انها سلسلة من الحروف او األرقام او الرموز الخاصة محصورة بين عالمتي اقتباس مفردة او مزدوجة‬

‫(" "‪.)‘ ‘ ،‬‬

‫يمكن تحويل السالسل الرمزية الى ارقام صحيحة او عشرية باستخدام الدالتين )(‪int() and float‬‬

‫‪1‬‬
‫على التوالي كما ذكرنا في الدرس الخامس ويمكن دمج (‪ )concatenate‬سلسلتين رمزيتين بوضع عالمة (‪)+‬‬

‫بينهما وكما موضح في المثال التالي‪:‬‬

‫وكذلك المثال التالي لقابلية التحويل‪:‬‬

‫وكما نالحظ هنا فقط تم التعامل مع (‪ )x,y‬على انها سالسل رمزية وقامت عالمة (‪ )+‬بأرفاق الثانية في نهاية األولى‬

‫في حين تم التعامل مع (‪ )z,w‬على انها اعداد صحيحة وقامت عالمة الجمع (‪ )+‬بطباعة ناتج جمعهما‪.‬‬

‫كذلك يمكن قراءة السالسل الرمزية من دالة االدخال (‪ )input‬ثم تحويلها وكما في ادناه‪:‬‬

‫‪2‬‬
‫وكما نالحظ هنا فقد قمنا بإدخال سلسلة رمزية تحت مسمى (‪ )x‬ثم تحويلها الى عدد عشري واعطيناه اسم متغير (‪)y‬‬

‫ثم الحظنا ان استخدام الضرب (*) بين ال (‪ )x‬ونفسه اعطى رسالة خطأ ألنهما سالسل رمزية ال يمكن ضربها ولكنه‬

‫اعطى ناتج الضرب للقيمة (‪ )y*y‬ألنهما عددان عشريان يمكن ضربهما وهكذا‪.‬‬

‫الى هنا يتضح لنا سهولة التعامل مع السالسل الرمزية كوحدة واحدة وكيفية تحويلها الى اعداد صحيحة او عشرية‬

‫ولكن االستخدام األهم للسالسل الرمزية يتضمن الدخول الى داخل السلسلة الرمزية والتعامل مع مكوناتها كوحدات‬

‫مستقلة ويتم ذلك باعتبارها مصفوفة وكما في ادناه‪:‬‬

‫حيث يمكننا ترقيم الرموز بداخل السلسلة الرمزية بدءا من الصفر من اليسار الى اليمين او من السالب واحد من‬

‫اليمين الى اليسار وكما موضح في المثال ادناه‪:‬‬

‫‪3‬‬
‫وهنا من الواضح اننا قمنا بإدخال سلسلة رمزية تحت اسم متغير (‪ )x‬ثم محاولة طباعة الرمز الثاني (]‪ )x[1‬والرمز‬

‫األول (]‪ )x[0‬وهكذا لبقية الرموز‪.‬‬

‫كذلك استطعنا معرفة طول السلسلة الرمزية (عدد رموزها) من الدالة المعرفة بداخل لغة بايثون (‪ len(x‬ورغم ان‬

‫طول السلسلة ‪ 81‬اال ان الرمز (]‪ )x[18‬غير موجود ألننا بدأنا الترقيم من الصفر أي ان اخر عنصر في سلسلة‬

‫طولها ‪ 81‬هو (]‪.)x[17‬‬

‫كذلك يمكن استخدام عبارات الشرط والتكرار مع السالسل الرمزية وكما في ادناه‪:‬‬

‫‪4‬‬
‫حيث تم استخدام أداة (‪ )while‬وباالستعانة بدالة طول السلسلة لعرض عناصر السلسلة مع فهرس (‪ )index‬كل‬

‫منها‪.‬‬

‫يمكن انجاز نفس العمل باستخدام أداة (‪ )for‬وكما في ادناه‪:‬‬

‫وكما نالحظ فأن القيام بذلك بهذه الطريقة أسهل بكثير مما كان مع (‪ .)while‬كما نالحظ هنا اننا لم نحتج الى استخدام‬

‫دالة طول السلسلة الرمزية ()(‪ )len‬ألننا قمنا بحساب طول السلسلة باستخدام اللوب وال (‪.)count‬‬

‫‪5‬‬
‫كذلك يمكن استخدام الحلقات التكرارية والشروط لحساب عدد مرات تكرار رمز معين في السلسلة وكما في المثال‬

‫التالي‪:‬‬

‫حيث قام الكود أعاله بحساب عدد مرات ورود الرمز (‪ )a‬في السلسلة الرمزية‪.‬‬

‫من األمور المهمة األخرى حول السالسل الرمزية والتي تم التطرق لها بشكل مختصر في الدرس الخامس هي تشريح‬

‫او تقطيع السالسل الرمزية (‪ )string slicing‬وذلك بطباعة جزء من السلسلة الرمزية يبدأ برقم معين وينتهي برقم‬

‫معين وكما في المثال ادناه‪:‬‬

‫‪6‬‬
‫استخدام (‪ )in‬كدالة منطقية‪:‬‬

‫ذكرنا سابقا ان عبارة (‪ )in‬المحفوظة في لغة بايثون لها استخدامات كثيرة مع عبارات التكرار والشروط وهنا يمكن‬

‫استخدامها ايضا كعبارة اختبار منطقية كما في األمثلة التالية‪:‬‬

‫مكتبة دوال السالسل الرمزية‪:‬‬

‫هناك الكثير من الدوال المحفوظة في لغة بايثون للتعامل مع السالسل الرمزية وسنتطرق الى بعضها في األمثلة‬

‫التالية‪:‬‬

‫‪7‬‬
‫ويمكن االطالع على تفاصيل أكثر ودوال أكثر عن السالسل الرمزية على الرابط التالي‪:‬‬

‫‪https://docs.python.org/2/library/stdtypes.html#string-methods‬‬

‫البحث بداخل السالسل الرمزية باستخدام دالة ()(‪:)find‬‬

‫من اهم الدوال المحفوظة في لغة بايثون للتعامل مع السالسل الرمزية هي دالة البحث ()(‪ )find‬والتي يمكن‬

‫استخدامها للعثور على رمز او مجموعة رموز وتعيد قيمة فهرس (‪ )index‬اول ظهور لتلك المجموعة او الرمز‬

‫كقيمة عددية وفي حالة عدم إيجاد الرمز المطلوب تقوم بأرجاع قيمة (‪ )8-‬وكما في ادناه‪:‬‬

‫‪8‬‬
‫البحث واالستبدال باستخدام دالة ()(‪:)replace‬‬

‫يمكن استخدام دالة ()(‪ )replace‬إليجاد رمز معين او مجموعة رموز واستبدالها برمز او مجموعة رموز وكما في‬

‫ادناه‪:‬‬

‫‪9‬‬
‫حيث ال يشترط كما الحظنا ان تكون السالسل التي نستبدلها بنفس الطول‪.‬‬

‫حذف المسافات الفارغة من بداية او نهاية السلسلة الرمزية‪:‬‬

‫كما هي عادة الكتابة باستخدام لوحة المفاتيح‪ ،‬تحتوي الكثير من الكلمات والجمل على مسافات فارغة قبل وبعد‬

‫الكلمات ولحذفها نستخدم الدوال التالية‪:‬‬

‫‪10‬‬
‫ومن الجميل ان نالحظ ان هذه الدوال ال تتالعب بالفراغات بين الكلمات في الجملة الواحدة مما ال يؤثر على المعنى‪.‬‬

‫دالة ()(‪)startswith‬‬

‫وتعمل كدالة اختبار منطقية (ترجع قيمة ‪ )true or false‬وكما في ادناه‪:‬‬

‫‪11‬‬
‫حيث يتم اسناد قيمة صح (‪ )true‬او خطأ (‪ )false‬اعتمادا على مقارنة القيمة المعطاة داخل دالة ()(‪)Startswith‬‬

‫مع الرمز او مجموعة الرموز التي تبدأ بها السلسلة الرمزية االصلية‪ .‬بخصوص الحالة األخيرة اعادت الدالة خطأ‬

‫بالرغم من انها تبدأ بالحرف (‪ )p‬ألن لغة بايثون حساسة لحالة الحروف (‪ )letter case sensitive‬أي انها تفرق‬

‫بين الحرف الكبير والصغير لذا يرجى االنتباه‪.‬‬

‫استخالص جزء من السلسلة الرمزية يبدأ برمز معين وينتهي برمز معين اخر‪:‬‬

‫يمكن عمل ذلك بأتباع الخطوات التالية‪:‬‬

‫وهو مهم جدا في التعامل مع السالسل الرمزية لمواقع االنترنت وكما سنرى الحقا ان شاء هللا‪.‬‬

‫واخيرا اليكم مثال محلول يوضح بعضا من خصائص السالسل الرمزية وكيفية التعامل معها‪:‬‬

‫‪12‬‬
‫التعامل مع الملفات ‪Files‬‬

‫كل ما تعاملنا معه لحد االن هو بيانات مؤقتة مخزونة في الذاكرة الرئيسية (‪ )RAM‬ولم نصل بعد الى التعامل مع‬

‫ملفات او بيانات مخزونة مسبقا ً في القرص الصلب الستدعائها الى المعالج لغرض معالجتها وإعادة خزنها وهو ما‬

‫سنتعامل معه اليوم ان شاء هللا‪.‬‬

‫الملفات‪ :‬هي تجمع من البيانات المرتبطة ببعضها البعض في مكان واحد (او عدة مكانات موزعة) في الذاكرة‪ .‬وسنركز‬

‫في درس اليوم على التعامل مع الملفات النصية (‪ )text files‬لقراءة محتوياتها والتنقل بينها والتعديل عليها او التقاط‬

‫شيء معين منها لالستفادة منه في مكان اخر وكما سنرى‪:‬‬

‫قبل التعامل مع محتويات ملف نصي معين يجب ان نقوم بقراءته ويتم ذلك باستخدام الدالة‪ Open():‬ويشترط في الملف‬

‫الذي نريد قراءته ان يكون مخزون في نفس مكان ملف البرنامج الذي نعمل عليه ‪ ،‬أي اننا ان قمنا بأنشاء ملف جديد‬

‫بامتداد (‪ ).py‬وقمنا بفتحه بأحد المفسرات للتعامل معه وقمنا باستدعاء الدالة ()(‪ )open‬فيجب ان يكون الملف الذي‬

‫نريد فتحه موجود في نفس مكان خزن ملف ال (‪ )*.py‬وكما في المثال ادناه‪:‬‬

‫‪13‬‬
‫هنا نشرح البرنامج وكما في ادناه‪:‬‬

‫السطر األول‪ :‬اسناد ما في الملف (‪ )first.txt‬الى متغير اسمه (‪ )x‬مع إعطاء نمط الفتح (‪ )mode‬الحرف (‪ )r‬ويعني‬

‫قراءة ملف (‪ )read‬بدون التعديل عليه واما إذا أردنا فتحه والكتابة بداخله فنستخدم الحرف (‪ )w‬من كلمة كتابة (‪)write‬‬

‫وجدير بالذكر ان النمط (‪ )mode‬اختياري أي اننا يمكن ان نكتب عبارة ()(‪ )open‬بدون عبارة االستدعاء للنمط‪.‬‬

‫مالحظة‪ :‬اسم الملف وامتداده والنمط يجب ان تكون محصورة بعالمات اقتباس مفردة او مزدوجة‪.‬‬

‫السطر الثاني‪ :‬عبارة تكرار ‪ for‬للتنقل بين مكونات الملف المحفوظ االن في المتغير (‪.)x‬‬

‫السطر الثالث‪ :‬طباعة مكونات الملف وكما هو ظاهر أعاله‪.‬‬

‫مالحظة مهمة جداً‪ :‬نالحظ ان الملف المطبوع يختلف عن الملف الموجود في الملف النصي بوجود سطر فارغ بين‬

‫السطرين في الملف والسبب في ذلك ان كل سطر في الملفات يتم استدعائه وبعده عبارة (‪ )\n‬أي النزول الى سطر جديد‬

‫‪14‬‬
‫وألن اخر رمز في أي سطر هو (‪ )\n‬ايضا ً فيحصل قفز سطرين أي ترك سطر فارغ في الوسط وللتخلص من هذه‬

‫المشكلة فقط نقوم باستخدام دالة ()(‪ )rstrip‬وكما في المثال ادناه‪:‬‬

‫وهنا نالحظ اننا استدعينا دالة قص الفراغات الى اليمين ()(‪ )rstrip‬التي تحدثنا عنها في الدرس السابق لتخليصنا من‬

‫السطر الفارغ بين السطرين بل وكل االسطر الفارغة في الملف (إذا كان يحتوي على الكثير من االسطر)‪.‬‬

‫مالحظة‪ :‬ان دالة ()(‪ )open‬هي ليست لحفظ الملف كله في متغير وانما لفتح نافذة بين الذاكرة الثانوية (الهارد) والذاكرة‬

‫الرئيسية (الرام) عن طريق المتغير وكما في الرسم التوضيحي التالي‪:‬‬

‫‪15‬‬
‫وكما يوضحه المثال ادناه‪:‬‬

‫هنا نرى ان طباعة المتغير (‪ )x‬ال تعطينا محتويات الملف وانما شيء يسمى (‪ )handler‬وهو مفتاح او قناة توصيل‬

‫بين الذاكرة الرئيسية والثانوية ومن هنا نعلم ان الطريقة الوحيدة للوصول الى محتويات الملف باستخدام دالة (‪ )for‬كما‬

‫ذكرنا في المثال األول‪.‬‬

‫في حالة محاولة فتح ملف غير موجود سنحصل على رسالة خطأ كما في ادناه‪:‬‬

‫‪16‬‬
‫مرة أخرى نعود الى الرمز سطر جديد (‪ )\n‬فهو يعتبر رمزاً خاصا ً في لغة بايثون وكما يوضحه المثال التالي‪:‬‬

‫هنا نالحظ ان الرمز (‪ ) \n‬على الرغم من كونه موجود بداخل عالمات اقتباس اال ان اللغة عرفت انه خاص بالنزول‬

‫الى سطر جديد وهذا ما حدث عند استخدام عبارة الطباعة وكذلك حين استعلمنا عن طول (‪ )length‬السلسلة الرمزية‬

‫(‪ )y‬قام بأخبارنا ان طولها ‪ 3‬اي انه تعامل مع (‪ )\n‬على انه رمز واحد فيجب االنتباه‪.‬‬

‫‪17‬‬
‫ولتوضيح المعنى أكثر تصور ان كل ملف هو مجموعة من االسطر وان كل سطر يحتوي في نهايته على رمز (‪)\n‬‬

‫وهذا ما تراه لغة بايثون في الملفات النصية‪:‬‬

‫لحساب عدد االسطر في ملف معين نتبع الخطوات في المثال ادناه‪:‬‬

‫واالن لقراءة ملف كامل نستخدم دالة ()(‪ )read‬وكما في ادناه‪:‬‬

‫‪18‬‬
‫وكما هو موضح في التعليقات امام كل سطر برمجي‪.‬‬

‫اما للبحث في داخل ملف معين فيمكن استخدام التقنية التالية‪:‬‬

‫‪19‬‬
‫حيث قمنا باستخدام دالة ()(‪ )startswith‬لطباعة السطر الذي يبدأ برمز معين او كلمة معينة او مجموعة رموز‪.‬‬

‫كذلك يمكن استخدام التقنية التالية لالستمرار في الحلقة التكرارية في حالة عدم توفر شرط معين او في حالة تحققه وكما‬

‫في المثال التالي‪:‬‬

‫حيث ان الشرط هنا انه ان كان السطر ال يبدأ بعبارة (‪ )hello‬فأكمل الحلقة التكرارية واال فأطبع عبارة ( ‪starts with‬‬

‫‪ .)hello‬كذلك يمكن البحث بداخل كل سطر من الملف باستخدام عبارة (‪ )in‬وكما في ادناه‪:‬‬

‫‪20‬‬
‫لحد االن كنا نتعامل مع ملف قمنا بإدخال اسمه من ضمن البرنامج وهذا ليس الوضع عادة حيث نريد ان نعطي للمستخدم‬

‫قابلية قراءة أي ملف يعرف اسمه ويقوم بتنفيذ أوامر معينة عليه وكما في ادناه‪:‬‬

‫‪21‬‬
‫وهنا قمنا بإد خال اسم الملف والذي يظهر اسمه ومحتوياته في الزاوية العليا اليسرى من الصورة أعاله والبرنامج الى‬

‫اليمين والتنفيذ الى األسفل ‪‬‬

‫وكما في كل البرامج السابقة يجب ان نأخذ بنظر االعتبار ان المستخدم قد يقوم بإدخال اسم ملف خاطئ او بدون امتداد‬

‫وهنا يجب ان نحسب حساب معالجة هذا الموقف وكما في ادناه‪:‬‬

‫‪22‬‬
‫حيث استخدمنا عبارة (‪ ) try exception‬لطباعة رسالة خطأ للمستخدم وانهاء التنفيذ ويمكن عدم انهاء التنفيذ والقيام‬

‫بأي عمل اخر بحسب رغبتنا وما يريده المستخدم النهائي منا‪.‬‬

‫واخيراً ارفق لكم مجموعة من األمثلة المحلولة للتعامل مع الملفات ومحتوياتها عسى ان تنفعكم ‪‬‬

‫‪23‬‬
24
‫كما في كل درس أتمنى ان تكون المادة المشروحة واضحة وانا حاضر ألي سؤال او استفسار وأتمنى التفاعل والمساعدة‬

‫في النشر لهذه الدروس لتعميم الفائدة وهللا الموفق لكل خير‪.‬‬

‫‪25‬‬
‫القوائم في لغة بايثون ‪Lists‬‬

‫القوائم (‪ )lists‬هي تجمع لعدد من البيانات في مكان واحد وتحت اسم واحد وهي تشبه الى حد كبير المصفوفات أحادية‬

‫البعد في لغات البرمجة األخرى وقد تم التطرق لها والتعامل معها منذ بداية الدورة والدروس األولى وميزتها اننا ال‬

‫نحتاج الى تعريفها بل نستخدمها مباشرة وال يشترط بعناصرها ان تكون من نوع واحد فقد يكون بعضها اعداد صحيحة‬

‫واألخرى عشرية والبعض االخر رموز او سالسل رمزية وكما في ادناه‪:‬‬

‫وكما تالحظون فما كتبناه هنا ليس جديداً في شيء فنحن قد تعاملنا مع مثل ذلك في اغلب الدروس السابقة وعرفنا كيف‬

‫نقوم بإدخال القائمة محصورة بقوسين من النوع الكبير ][ وتفصل بين عناصرها فارزة ولو كان ضمن عناصرها رموز‬

‫او سالسل رمزية فيجب حصرها بعالمات اقتباس مفردة او مزدوجة‪ .‬وعرفنا أيضا ً كيف يمكننا الوصول الى أي عنصر‬

‫في القائمة وكما في أعاله‪ .‬واخيراً عرفنا ان استدعاء عنصر خارج نطاق القائمة يسبب ظهور رسالة خطأ‬

‫(‪.)traceback‬‬

‫كما ذكرنا فأن القائمة هي تجمع لعدة متغيرات في مكان واحد واما تعريف متغير مفرد فليس قائمة وكما في ادناه‪:‬‬

‫‪26‬‬
‫وهنا نالحظ ان (‪ )x,y,z‬هي متغيرات ولكن (‪ )w‬هي قائمة وهكذا‪.‬‬

‫القوائم في لغة بايثون قد تكون فارغة وقد تحتوي عدد محدد او غير محدد من العناصر وقد تحتوي قوائم فرعية (‪sub-‬‬

‫‪ )lists‬بداخلها وكما يوضحه المثال التالي‪:‬‬

‫‪27‬‬
‫وهنا نالحظ ان (‪ )x‬قائمة فارغة و(‪ )y‬ليست فارغة و (‪ )z‬قائمة تحتوي ‪ 7‬عناصر بعضها متغيرات او ثوابت وبعضها‬

‫قوائم فرعية‪ .‬واخيراً يمكن استخدام اشارة الجمع (‪ )+‬ألرفاق (‪ )append‬القوائم بعضها ببعض حيث أرفقنا القائمة (‪)z‬‬

‫في نهاية القائمة (‪ )y‬ووضعنا الكل في القائمة (‪.)w‬‬

‫انشاء القوائم‪:‬‬

‫سبق ان تعلمنا كيفية انشاء قائمة او التعامل معها واليكم بعض الطرق لذلك‪:‬‬

‫االمر االخر المهم حول القوائم هو الفرق المهم بين قوائم الرموز وقوائم األرقام حيث يمكن تغيير محتويات قوائم األرقام‬

‫ولكن ال يمكن التالعب بمحتويات قوائم الرموز في البايثون (‪ )2.7‬ولكن كل ذلك ممكن في البايثون (‪ )3‬وما بعده وكما‬

‫يوضحه المثال التالي‪:‬‬

‫‪28‬‬
‫ايضا ً لمعرفة طول القائمة نستخدم دالة ()(‪ )len‬وكما في ادناه‪:‬‬

‫‪29‬‬
‫من أدوات انساء القوائم التلقائية هي الدالة ()(‪ ) range‬التي تستخدم ألنشاء قوائم تحتوي عدد من الرموز يساوي العدد‬

‫المكتوب بداخل الدالة وكما في المثال ادناه‪:‬‬

‫كما ذكرنا سابقا ً ايضا ً يمكن ايضا ً تشريح (‪ )slicing‬القوائم بطباعة جزء او أجزاء منها وكما في المثال ادناه‪:‬‬

‫‪30‬‬
‫وقد تم سابقا ً شرح معنى كل من االيعازات أعاله‪.‬‬

‫دوال القوائم‪:‬‬

‫كما ذكرنا سابقا ً فأحد أبرز الدوال المستخدمة مع القوائم هي دالة ()(‪ )list‬ألنشاء دالة فارغة واما دالة ()(‪)type‬‬

‫فتستخدم إلرجاع نوع القائمة او المتغير كما رأينا سابقا ً واخيراً هناك دالة المجلد ()(‪ )dir‬والتي تعرض كل الدوال‬

‫المتوفرة لنوع معين من المتغيرات او القوائم وكما في ادناه‪:‬‬

‫‪31‬‬
‫هنا قد يتساءل البعض عن كيفية االستفادة من دالة ()(‪ )list‬والتي تبني قائمة فارغة؟ والجواب يمكن معرفته من المثال‬

‫التالي‪:‬‬

‫‪32‬‬
‫استخدام أدوات (‪ )in, not in‬الختبار وجود او عدم وجود عنصر معين في القائمة‪ :‬يوضحه المثال التالي‪:‬‬

‫‪33‬‬
‫كيفية ترتيب قائمة ابجديا ً للرموز والسالسل الرمزية ومن الصغير للكبير بالنسبة لألرقام‪:‬‬

‫باستخدام دالة ()(‪ )sort‬وكما في ادناه‪:‬‬

‫‪34‬‬
‫بعض الدوال المحفوظة في لغة بايثون للتعامل مع القوائم‪:‬‬

‫تجزئة السالسل الرمزية الى عناصرها وتحويلها الى قوائم‪:‬‬

‫ويتم ذلك باستخدام دالة ()(‪ )split‬وكما يوضحها المثال التالي‪:‬‬

‫‪35‬‬
‫هنا قمنا بتعريف متغير اسمه (‪ )a‬ونوعه سلسلة رمزية ثم قمنا بتجزئته ()(‪ )split‬ووضع األجزاء على شكل قائمة في‬

‫المتغير (‪ )b‬ثم قمنا بعمل نفس الشيء مع ال (‪ )c‬وال (‪ )d‬اال ان الفرق الوحيد اننا جزئنا ال (‪ )a‬على أساس المسافات‬

‫الفارغة (‪ )spaces‬وهو ما يحصل حين نترك دالة (‪ )Split‬فارغة واما مع ال (‪ )c‬فقد قمنا بالتجزئة اعتماداً على‬

‫الحرف (‪ )b‬حيث يتم تجزئة السلسلة الرمزية الى مجموعة سالسل او مجموعة عناصر في قائمة عند كل ذكر للحرف‬

‫(‪ )b‬وكما شاهدنا أعاله‪.‬‬

‫مالحظة‪ :‬عند ترك دالة (‪ )split‬فارغة فأن أي عدد من الفراغات (‪ )spaces‬بين الحروف والكلمات يعتبر مسافة واحدة‬

‫ويتم التجزئة على أساسها فيجب االنتباه‪.‬‬

‫واخيراً اليكم مثال عن كيفية التعامل مع أجزاء النصوص والسالسل الرمزية وكيفية الوصول الى ادق التفاصيل باستخدام‬

‫دوال القوائم والتجزئة‪:‬‬

‫وكما هي عادتنا نختم درسنا بمجموعة من األمثلة المحلولة للفائدة‪.‬‬

‫‪36‬‬
37
38
‫المجلدات او القواميس في لغة بايثون ‪Dictionaries‬‬

‫وهي أحد أنواع البيانات او مجاميع البيانات (‪ )collections‬والتي تسمح بجمع مجموعة غير مرتبة من األسماء والقيم‬

‫(‪ )values and keys‬ووضعها تحت اسم واحد وهذا هو فرقها الرئيسي عن القوائم التي تتميز بترتيب عناصرها وهي‬

‫أكثر مرونة من القوائم التي سبق شرحها ويمكن التعبير عن المجلد بالصورة التوضيحية التالية‪:‬‬

‫‪39‬‬
‫حيث ان المجلد يشبه الحقيبة التي تحتوي مجموعة من األشياء وبأعداد مختلفة والهدف الرئيسي من إيجاد المجلدات في‬

‫لغة بايثون لتسهيل عملية حساب عدد مرات تكرار عنصر معين (رمز او رقم او سلسلة رمزية) في ملف او سطر من‬

‫ملف نصي‪.‬‬

‫ويمكن تعريف المجلد كما في المثال ادناه‪:‬‬

‫وهنا عرفنا مجلد اسمه (‪ )classroom‬باستخدام دالة ()(‪ )dict‬وقمنا بإضافة عناصره واحداً بعد االخر ثم حين طلبنا‬

‫طباعته جاءت النتيجة كما هو متوقع بترتيب مغاير لما تم إدخاله وهو امر يختلف عما اعتدنا عليه في القوائم وبعدها‬

‫ومن مميزات المجلدات عملها كقواعد بيانات للغة بايثون تمكننا من الوصول الى أي عنصر بمعرفة مفتاحه (‪)the key‬‬

‫ليرجع لنا القيمة المحفوظة بداخله (‪ )the value‬وحين طلبنا قيمة لمفتاح غير معرف جاءت رسالة الخطأ (‪)traceback‬‬

‫لتخبرنا ان المفتاح (‪ )pens‬غير معرف‪.‬‬

‫‪40‬‬
‫واالن لمعرفة الفرق بين القوائم والمجلدات أكثر الحظوا المقارنة التالية‪:‬‬

‫واالن ألنشاء قائمة فارغة عرفنا اننا نستطيع فعل ذلك باستخدام دالة ()(‪ )list‬كما في الصورة أعاله وألنشاء مجلد فارغ‬

‫فقط نستخدم الدالة ()(‪ )dict‬ولكن يمكن ايضا ً انشاء مجلد فارغ باستخدام اقواس المجموعة فارغة وكما في ادناه‪:‬‬

‫كما ذكرنا قبل قليل فأن اهم تطبيق للمجلدات معرفة عدد مرات تكرار رقم او حرف او سلسلة رمزية في سطر او ملف‬

‫نصي وهذا هو ما سنركز عليه في شرحنا لهذا الدرس علما ً ان المجلدات يمكن ان تستخدم في امكان أخرى عديدة‬

‫وحسب حاجة المبرمج‪.‬‬

‫واالن إذا ان هناك قائمة من األسماء واردنا معرفة أي اسم تكرر أكثر من األسماء األخرى فكل ما علينا فعله هو انشاء‬

‫مجلد وتسميه مفاتيح مشابهة لألسماء واضافة ‪ 1‬الى قيمة االسم كلما تكرر ذكره وكما في ادناه‪:‬‬

‫‪41‬‬
‫يمكن ايضا ً استخدام دالة (‪ )in‬كدالة منطقية لمعرفة هل يوجد مفتاح معين في المجلد او ال وكما في ادناه‪:‬‬

‫‪42‬‬
‫واالن نعود الى مثالنا عن عدد مرات تكرار اسم معين‪ .‬حيث الحظنا في الحالة السابقة اننا نقوم بإضافة األسماء وعدد‬

‫مرات تكرارها يدويا ً كل مرة وهذه طريقة غير مجدية برمجيا ً خصوصا ً ان كنا نتعامل مع ملف يحتوي االلف الكلمات‬

‫والمفاتيح والقيم وهنا نستخدم التركيب التالي‪:‬‬

‫من المثال أعاله نالحظ اننا نستطيع استخدام دالة (‪ )for‬للتنقل بين عناصر المجلد كما في القوائم تماما ً مستخدمين اسمها‬

‫وسيقوم المفسر باستخدام قيم المفاتيح (‪ )keys‬للتنقل بين عناصر المجلد وهنا قلنا للمفسر انه لكل اسم (‪ )name‬وهو‬

‫اسم متغير عشوائي موجود في مجلد األسماء‪ :‬ان كان غير موجود في قائمة االعداد السابقة فأجعل قيمته ‪ 1‬واال فأضف‬

‫الى قيمته السابقة ‪ 1‬وبذلك نكون قد قمنا بعد كل األسماء ومعرفة عدد مرات تكرار كل منها‪.‬‬

‫واالن ألن السيناريو أعاله يتكرر بكثرة عند استخدام المجلدات فقد تم بناء دالة خاصة فقط تقوم بكل ما ذكر أعاله واسم‬

‫هذه الدالة ()(‪ )get‬وتقوم هذه الدالة بما يلي‪:‬‬

‫إذا كان المفتاح موجوداً في القائمة المعدة مسبقا ً تقوم بإضافة واحد له‪.‬‬
‫‪43‬‬
‫إذا كان المفتاح غير موجود في القائمة تقوم بأسناد قيمة افتراضية (‪ )default value‬له ونحن من نقوم بإعطاء القيمة‬

‫االفتراضية وبحسب الحاجة وكما في ادناه‪:‬‬

‫حيث تقوم الدالة هنا بعد األسماء وعدد مرات تكرار كل منها وتضيف القيمة االفتراضية لالسم الغير مذكور سابقا ً (‪.)0‬‬

‫واالن الصيغة العامة لحساب عدد مرات تكرار اسم معين او سلسلة رمزية معينة في المثال التالي‪:‬‬

‫‪44‬‬
‫واالن لنشرح البرنامج خطوة بخطوة‪:‬‬

‫السطر األول‪ :‬انشاء مجلد فارغ‬

‫السطر الثاني‪ :‬طباعة عبارة على الشاشة تطلب من المستخدم ادخال سطر من الكلمات‬

‫السطر الثالث‪ :‬استخدام عبارة االدخال للسماح للمستخدم بإدخال سطر البيانات‪.‬‬

‫السطر الرابع‪ :‬استخدام عبارة تجزئة السطر الى كلمات ()(‪.)split‬‬

‫السطر الخامس‪ :‬طباعة قائمة الكلمات التي تكون السطر المدخل‪.‬‬

‫‪45‬‬
‫السطر السادس‪ :‬طباعة عبارة (… ‪.)counting‬‬

‫السطر السابع والثامن والتاسع‪ :‬عملية العد كما ذكرناها سابقا ً وطباعة النتائج‬

‫وكما ذكرنا سابقا ً فأن عبارة (‪ )for‬يمكن ان تستخدم للتنقل بين مكونات المجلد وكما في ادناه‪:‬‬

‫واما السترجاع مكونات المجلد كقوائم منفصلة للمفاتيح (‪ )keys‬او القيم (‪ )values‬او األزواج المرتبة للمفاتيح والقيم‬

‫(‪ )items‬نستخدم العبارات التالية‪:‬‬

‫‪46‬‬
‫كذلك من األمور المميزة في المجلدات إمكانية استخدام عبارة (‪ )for‬المزدوجة بمتغيرين ليكون أحدهما معبراً عن‬

‫المفاتيح واألخر عن القيم وكما في ادناه‪:‬‬

‫‪47‬‬
‫واخيراً وكملخص لكل ما درسنا لحد االن أتمنى التركيز على المثال التالي حيث يشرح كيفية توظيف كل الدوال‬

‫والمميزات التي شرحناها لحد االن عن السالسل الرمزية والملفات وأدوات االدخال واإلخراج والقوائم والمجلدات‬

‫لقراءة ملف وتجزئة محتوياته ثم التعامل مع كل منها على حدة لحساب عدد مرات تكرار كل كلمة ثم طباعة الكلمة التي‬

‫ذكرت أكثر عدد من المرات مع عدد مرات التكرار فتابعوا‪:‬‬

‫‪48‬‬
‫الصفوف او المجاميع ‪Tuples‬‬

‫نصل اليوم الى شرح النوع الثالث من أنواع مجاميع البيانات في لغة البايثون بعد ان شرحنا القوائم (‪ )lists‬والمجلدات‬

‫او القواميس (‪ )directories‬وهذا النوع يسمى الصفوف او المجاميع (‪ .)Tuples‬وهذا النوع من البيانات يشبه الى حد‬

‫كبير القوائم في كونه يتكون من مجموعة من العناصر اال ان العناصر هنا تكون محصورة بين قوسين صغيرين () بدالً‬

‫من االقواس الكبيرة للقوائم ][ والميزة األهم للصفوف ان عناصرها غير قابلة للتعديل (‪ )immutable‬ولذا تستخدم‬

‫عادة بشكل كفوء كبديل للقوائم والمجلدات في حالة الحاجة الى التعامل مع قوائم مؤقتة (‪ )Temporary lists‬بدون‬

‫الحاجة الى تغيير مكوناتها حيث انها تأخذ مساحة اقل من الذاكرة ووقتا ً اقل في المعالجة من قبل وحدة المعالجة المركزية‬

‫(‪ )CPU‬ويمكن التعامل معها في لغة بايثون كما في ادناه‪:‬‬

‫‪49‬‬
‫وهنا تتضح الفوارق الرئيسية بين القوائم والصفوف حيث رأينا ان (‪ )a‬هي قائمة يمكن استدعاء عناصرها وتغييرها‬

‫في حين ال يسمح الصف (‪ )b‬باستدعاء عناصره او تغييرها‪ .‬كذلك لمعرفة نوع المجاميع التي نتعامل معها نستخدم دالة‬

‫(‪ )type‬وكما في ادناه‪:‬‬

‫يمكن التعامل مع الصفوف كمتغيرات تماما ً كما تعاملنا مع القوائم والمجلدات بإدخالها ضمن عبارات الشروط والتكرار‬

‫وكل ما تعلمناه سابقا ً من أدوات االدخال واالخراج وكما في ادناه‪:‬‬

‫‪50‬‬
‫من مميزات القوائم األخرى انها وكما قلنا غير قابلة لتغيير عناصرها ولذا فهي غير قابلة للترتيب او اإلضافة او الحذف‬

‫كما هو ممكن في القوائم وكما في ادناه‪:‬‬

‫‪51‬‬
‫ولمعرفة الدوال التي تعمل مع الصفوف نستخدم دالة ()(‪ )dir‬كما في القوائم والمجلدات وكما في ادناه‪:‬‬

‫‪52‬‬
‫من مميزات الصفوف ايضا ً قابلية االسناد المزدوج واألكثر من المزدوج (اسناد عنصرين او أكثر الى قيمتين او أكثر‬

‫في نفس الوقت) وكما في ادناه‪:‬‬

‫‪53‬‬
‫وهنا كما الحظنا استطعنا ان نسند عنصرين وهما (‪ )a,b‬الى قيم (‪ )5,6‬في ايعاز واحد كما رأينا كيف يمكن تنفيذ‬

‫ايعازات الجمع والضرب على الصفوف حيث ال يتم الجمع وال الضرب وانما ارفاق او تكرار الصف اكثر من مرة‬

‫‪54‬‬
‫وبحسب االيعاز‪ .‬واخيراً رأينا كيف انه ال يمكن إضافة عناصر رمزية الى الصفوف وال يمكن ارفاق سلسلة رمزية مع‬

‫متغيرات صحيحة وهي أمور بديهية االن لمن تابع دورتنا من البداية ‪‬‬

‫واالن للتنقل بين القواميس (‪ )dictionaries‬والصفوف (‪ )tuples‬نستخدم ايعاز ()(‪ ).items‬ليحول لنا المجلد او‬

‫القاموس الى سلسلة من األزواج المرتبة (‪ )tuples‬وكما في ادناه‪:‬‬

‫‪55‬‬
‫واالن من مميزات الصفوف قابلية المقارنة بينها حيث ان كان الصف يتكون من ‪ 4‬عناصر واردنا المقارنة فيتم مقارنة‬

‫العنصر األول من الصف األول بالعنصر األول من الصف الثاني فأن تساويا فيتم االنتقال الى مقارنة العنصر الثاني‬

‫من الصف األول بالعنصر الثاني من الصف الثاني وهكذا وكما توضحه األمثلة التالية‪:‬‬

‫من المميزات الهامة للصفوف هو إمكانية ترتيب عناصرها باستخدام دالة ()( ‪ )sorted‬وكما في ادناه‪:‬‬

‫‪56‬‬
‫واالن نالحظ انه في المثال أعاله قمنا بترتيب عناصر القاموس اعتماداً على المفاتيح (‪ )keys‬واما لو أردنا الترتيب‬

‫بحسب القيم (‪ )values‬فنقوم بالتالي‪:‬‬

‫‪57‬‬
‫واخيراً اليكم بعض األمثلة التي تجمع الكثير من المبادئ التي تعلمناها لحد االن‪:‬‬

‫المثال األول‪ :‬فتح ملف وقراءة محتوياته ثم حساب عدد مرات تكرار كل كلمة وطباعة الكلمات العشرة األكثر تكراراً‬

‫وعدد مرات تكرار كل منها‪:‬‬

‫‪58‬‬
‫المثال الثاني‪ :‬قراءة ملف بريد الكتروني ومعرفة عدد الرسائل التي تم استالمها في كل ساعة واستخراج الساعات من‬

‫السطور التي تبدأ بكلمة (‪ ) From‬وتجزئة تلك االسطر الى حد الساعة ثم حساب عدد الرسائل لكل ساعة وترتيبها‬

‫وطباعتها جميعاً‪:‬‬

‫‪59‬‬
‫التعابير القياسية (‪)Regular Expressions‬‬

‫ربما الحظتم احبتي الكرام ان تركيزنا في هذه الدورة لحد االن هو على كيفية استخدام لغة بايثون الستخالص معلومات‬

‫مفيدة من ملفات بيانات نصية وهو ما ركز عليه الكتاب المنهجي لهذه الدورة (‪ )Python of Informatics‬والبد ان‬

‫اغلبكم يعلم ان تطبيقات بايثون ال تقتصر على هذا وانما على برمجة تطبيقات الحاسوب وبرمجة مواقع االنترنت‬

‫وبرمجة األجهزة المستخدمة في السيطرة والتحكم والكثير الكثير من المجاالت األخرى ولكن هدفنا هنا هو دورة‬

‫اساسيات للغة البايثون للمبتدئين وحتى المحترفين في مجال المعلوماتية وقد تعلمنا لحد االن الكثير من الطرق للبحث‬

‫عن بيانات معينة في سطر او ملف واستخالص ما نريد وطباعته او معالجته بطريقة معينة‪.‬‬

‫كل ما في االمر ان هناك طرق مختصرة أكثر وأسرع لتحقيق ما كنا نكتبه في ‪ 11‬او أكثر من االسطر البرمجية في‬

‫سطر واحد او سطرين!‬


‫‪60‬‬
‫نعم يمكن كل ذلك باستخدام رموز برمجية معقدة الى حد ما تنتمي الى مدرسة البرمجة القديمة ( ‪old school‬‬

‫‪ )programming‬حين كانت البرمجة معقدة للغاية ومليئة بالرموز واالختصار لتقليل حجم البرامج وزمن تنفيذها حين‬

‫كانت سرعة المعالجات محدودة والذواكر صغيرة‪.‬‬

‫على كل حال ينصح خبراء البرمجة بتعلم هذه الطرق المختصرة للبرمجة لمن يريد الحرص على صغر البرامج وسرعة‬

‫تنفيذها وال داعي للقلق في حالة عدم فهمها فقد تعلمنا (وسنتعلم ان شاء هللا) طرق أكثر بساطة في تحقيق كل ما تحققه‬

‫األدوات التالية‪:‬‬

‫واالن لنبدأ باألمور اوالً بأول‪:‬‬

‫قبل استخد ام أي من هذه األدوات ال بد من استدعاء مكتبة خاصة بها ويتم ذلك بوضع عبارة (‪ )import re‬في بداية‬

‫البرنامج‪.‬‬

‫أهمية التعابير القياسية وخصائصها‪:‬‬

‫‪ -‬انها فعالة جداً ومختصرة ومشفرة الى حد كبير‪.‬‬

‫‪ -‬انها ممتعة حالما تتعلم كيفية استخدامها‪.‬‬

‫‪61‬‬
‫‪ -‬تعتبر التعابير القياسية لغة بحد ذاتها وتشترك الكثير من خصائصها مع العديد من لغات البرمجة األخرى‪.‬‬

‫‪ -‬تسمى هذه اللغة الخاصة لغة برمجة رموز التأشير (‪ )marker characters‬وهي أحد أدوات المدرسة القديمة‬

‫(‪ )old school‬في البرمجة‪.‬‬

‫‪ -‬قبل استخدام هذه التعابير يجب استيراد مكتبتها (‪.)import re‬‬

‫‪ -‬تستطيع هذه التعابير استخدام دوال ()(‪ )re.search‬لمطابقة سالسل رمزية مع رموز معينة يتم إدخالها وهي‬

‫تشبه الى حد كبير دالة ()(‪ )find‬اال انها أكثر كفاءة كما سنرى‪.‬‬

‫‪ -‬تستطيع هذه التعابير استخدام دالة ()(‪ )re.findall‬الستخالص جزء من سلسلة رمزية تطابق مدخالتنا وهي‬

‫تشبه عمل كل من دالة البحث ()(‪ )find‬والتشريح للسالسل الرمزية (‪.)slicing‬‬

‫واالن قبل الخوض في إعطاء امثلة للمقارنة بين شكل البرنامج عند استخدام التعابير القياسية وبدونها‪ ،‬ال بد من شرح‬

‫معنى كل منها فتعالوا معنا‪:‬‬

‫االستخدام‬ ‫التعبير‬

‫مطابقة بداية السطر‪.‬‬ ‫^‬

‫مطابقة نهاية السطر‪.‬‬ ‫‪$‬‬

‫مطابقة أي رمز في سلسلة رموز‪.‬‬ ‫‪.‬‬

‫مطابقة المسافات (الفراغات) او ‪whitespaces‬‬ ‫‪\s‬‬

‫مطابقة الرموز التي ليست فراغات (‪)non-whitespaces‬‬ ‫‪\S‬‬

‫كما في البحث يستخدم للداللة على (‪ )anything‬ألي عدد من الرموز من صفر الى أي عدد اخر‪.‬‬ ‫*‬

‫نفس الرمز السابق اال انه يسمى التكرار غير الطماع (‪ )non greedy‬أي انه يتوقف عند او مطابقة‪.‬‬ ‫?*‬

‫مثل عمل ال * تماماً‪.‬‬ ‫‪+‬‬

‫‪62‬‬
‫مثل عمل ?* تماماً‪.‬‬ ‫?‪+‬‬

‫مطابقة رمز واحد من هذه الرموز مع المدخالت المعطاة‪ .‬يمكن وضع أي رمز هنا‪.‬‬ ‫]‪[abcd‬‬

‫مطابقة رمز واحد ليس في هذه القائمة وايضا ً يمكن وضع أي رمز هنا (حرف صغير او كبير او‬ ‫]‪[^abcd‬‬

‫رموز خاصة او ارقام)‪.‬‬

‫هذه االقواس يمكن ان تحتوي مدى من الرموز بينها عالمة الشرطة (‪ )-‬وألي سلسلة من الرموز او‬ ‫]‪[0-9‬‬

‫األرقام المتتالية‪.‬‬ ‫]‪[a-z‬‬

‫]‪[A-Z‬‬

‫اقواس البداية والنهاية لالستخالص حيث يتم ارجاع ما بداخلها فقط من ما ترجعه بقية األدوات من‬ ‫)(‬

‫مطابقة او اختالف او غيرها‪.‬‬

‫واالن الى األمثلة حيث سنتناول مجموعة من األمثلة التي تحدثنا عنها في الدروس السابقة ولكن هذه المرة سنأخذها مرة‬

‫مع التعابير القياسية ومرة بدونها (وهو ما شرحناه لحد االن)‪.‬‬

‫المثال األول‪:‬‬

‫البرنامج الى جهة اليسار هو ما تعلمناه سابقا ً من فتح (قراءة) ملف نصي ثم استخدام (‪ )for‬للتنقل بين اسطره وإلغاء‬

‫الفراغات الى يمين (نهاية) كل سطر ثم البحث عن االسطر التي تبدأ بكلمة (‪ )From:‬لطباعتها‪.‬‬

‫‪63‬‬
‫اما البرنامج الى اليمين فهو يقوم بالمثل بالضبط ولكن باستخدام التعابير القياسية حيث استخدمنا دالة ()( ‪)re.search‬‬

‫وفي داخلها وضعنا (‪ )‘Form: ‘, line‬وتعني ابحث باستخدام التعابير القياسية (التي لم نستخدم أي منها هنا!) عن أي‬

‫كلمة (‪ )From:‬لطباعة سطرها‪.‬‬

‫المثال الثاني‪:‬‬

‫هنا نفس البرنامج مع تحديد أكثر بالبحث عن السطر الذي يبدأ بكلمة (‪ From‬وليس أي كلمة (‪ )from‬في أي مكان‬

‫من السطر والبرنامج الى اليسار يفترض انه مفهوم واما البرنامج الى اليمين ففيه العبارة التالية التي تستحق الشرح‪:‬‬

‫‪if re.search('^From:', line) :‬‬

‫حيث قلنا للمترجم هنا‪ :‬اذا كانت نتيجة البحث عن (السطر الذي يبدأ (^) بعبارة (‪ ) )From:‬صحيحة (‪.)True‬‬

‫بعدها السطر األخير الذي يطلب طباعة السطر‪.‬‬

‫وهنا الحظنا كيف استخدمنا اول تعبير قياسي (^) للمقارنة ببداية السلسلة الرمزية‪.‬‬

‫المثال الثالث‪:‬‬

‫ذكرنا ان النقطة (‪ ).‬تعني مطابقة أي رمز وعالمة (*) تعني أي عدد من الرموز وعند اجتماعهما معا ً يعطيان البحث‬

‫والمطابقة بعداً جديداً يسمى احيانا ً (‪ )wild card‬وكما في المثال ادناه‪:‬‬

‫‪64‬‬
‫وهنا معنى التركيبة الى اليمين قم بالبحث والمطابقة لكل سلسلة رمزية تبدأ (^) بحرف (‪ )X‬كبير ثم بعده أي رمز (‪).‬‬

‫او مجموعة من الرموز (*) ومثال ذلك كما في ادناه‪:‬‬

‫المثال الرابع‪:‬‬

‫واالن لنشرح المثال أعاله‪:‬‬

‫السطر األول‪ :‬استيراد لمكتبة التعابير القياسية‪.‬‬

‫السطر الثاني‪ :‬تعريف لمتغير اسمه (‪ )count‬ومنحه قيمة أولية مقدارها صفر‪.‬‬

‫السطر الثالث‪ :‬تعريف لمتغير اسمه (‪ )a‬وهو عبارة عن سلسلة رمزية واضحة باللون األخضر‪.‬‬

‫السطر الرابع‪ :‬عبارة (‪ )for‬للتنقل بين مكونات السلسلة الرمزية حيث يكون كل مجموعة رموز يفصل بينها وبين ما‬

‫قبلها وما بعدها فراغ كعنصر واحد من عناصر السلسلة الرمزية نسميها (‪.)word‬‬

‫‪65‬‬
‫السطر الخامس‪ :‬شرط للبحث باستخدام التعابير القياسية نصه يقول‪ :‬ابحث عن التراكيب التي تبدأ بحرف (‪ )M‬كبير‬

‫وبعده مجموعة من الرموز في كل جزء (‪ )word‬من السلسلة (‪ )a‬وفي حالة كون الشرط صحيح سيتم تطبيق السطر‬

‫السادس‪.‬‬

‫السطر السادس‪ :‬قم بزيادة عدد ال(‪ )Count‬بمقدار واحد‪.‬‬

‫السطر السابع‪ :‬طباعة عبارة ( ‪ )count is‬ثم عدد مرات تكرار ذلك التركيب الذي كنا نبحث عنه‪.‬‬

‫ناتج التنفيذ‪ :‬ظهر لنا ان ناتج التنفيذ هو ‪ 3‬وهي الكلمات (‪ .)Mustafa, My, Mustafa‬والتي يبدأ كل منها بحرف‬

‫(‪ )M‬كبير وبعده مجموعة رموز غير محددة‪.‬‬

‫مالحظة‪ :‬بعض األحيان البيانات تكون غير مرتبة او (‪ )Clean‬كما نتوقع فيجب ان نحسب حساب كل االحتماالت‬

‫ونضيق نطاق البحث باستخدام أدوات أخرى من ضمن التعابير القياسية وكما في المثال ادناه‪:‬‬

‫المثال الخامس‪:‬‬

‫هنا قمنا بنفس خطوات المثال أعاله غير اننا فقط اضفنا الى شرط المطابقة العبارة التالية‪:‬‬

‫‪66‬‬
‫ابحث عن الكلمات التي تبدأ بالحرف (‪ )M‬ثم أي مجموعة من الحروف ثم الرمز (‪ ):‬وهنا نجد ان المطابقة كانت رمزاً‬

‫واحداً فقط‪.‬‬

‫كذلك نستطيع عمل المثل كما في المثال التالي‪:‬‬

‫حيث قلنا للمفسر هنا‪ :‬قم بمطابقة الكلمات (او السالسل الرمزية) التي تبدأ بالحرف الكبير (‪ )X‬ثم بعده مجموعة رموز‬

‫ليست فراغات ثم رمز (‪ ):‬ونرى في الجانب االيسر ان اول عبارتين طابقتا المطلوب ولكن العبارة الثالثة لم تعد مطابقة‬

‫ألن بين ال (‪ )X‬وال (‪ ):‬توجد مجموعة فراغات‪.‬‬

‫‪67‬‬
‫التعابير القياسية ‪2‬‬

‫بعد ان تحدثنا عن مقدمة التعامل مع التعابير القياسية (‪ )Regular Expressions‬ومميزاتها وبعض األمثلة عنها في‬

‫الدرس السابق‪ ،‬نأتي اليوم الى اكمال حديثنا عنها بشرح المزيد من األمثلة للمقارنة بين مميزات استخدامها والبرمجة‬

‫بدونها وكما كرنا سابقا ً يبقى خيار استخدامها او تركها للمبرمج مع التأكيد على أهميتها لتقليل حجم البرنامج وتسريع‬

‫التنفيذ فتابعوا معنا‪:‬‬

‫المثال األول‪ :‬استرجاع األرقام فقط‪:‬‬

‫هذا المثال يتكون من ثالث أسطر برمجية فقط في األول قمنا باستيراد مكتبة التعابير القياسية التي ال يمكن ان تعمل اال‬

‫باستيراد مكتبتها والسطر الثاني ادخال لقيمة المتغير (‪ )x‬واما السطر الثالث فهو تعريف للمتغير (‪ )y‬واسناد قيمة (او‬

‫قيم) له هي عبارة عن ناتج تنفيذ عبارة البحث ضمن المتغير (‪ )x‬عن أي سلسلة رقمية تحتوي األرقام من الصفر الى‬

‫التسعة ويمكن البحث عن أي سلسلة رقمية او رمزية وكما في ادناه‪:‬‬

‫‪68‬‬
‫المثال الثاني‪ :‬استرجاع قيم رمزية لمجموعة حروف معينة فقط‪:‬‬

‫وكما شرحنا في أعاله‪:‬‬

‫‪ Y‬تقوم بإرجاع األرقام‬

‫‪ Z‬تقوم بإرجاع السالسل الرمزية التي تحتوي الحروف الصغيرة من ‪ a‬الى ‪ r‬علما ً ان ال ‪ r‬من ضمنها‪.‬‬

‫‪ W‬تقوم بإرجاع السالسل الرمزية التي تتكون من حروف كبيرة فقط‪.‬‬

‫‪69‬‬
‫المثال الثالث‪:‬‬

‫هنا قلنا للمفسر قم بطباعة قيمة المتغير (‪ )y‬على انها أي سلسلة رمزية تبدأ بالحرف الكبير (‪ )F‬ثم بعده مجموعة رموز‬

‫وصوالً الى النقطتين (‪ ):‬ولكن ألن الرمزين (‪ +‬و *) يسميان أدوات المطابقة الطماعة (‪)greedy matching tools‬‬

‫فهما يقومان بالتعدي الى ابعد نقطة مطابقة لل شروط ولذلك لم تتوقف المطابقة عند اول نقطتين (‪ ):‬وانما تجاوزتها الى‬

‫اخر نقطتين‪ .‬ولتالفي هذه المشكلة نتابع المثال التالي‪:‬‬

‫المثال الرابع‪ :‬المطابقة غير الطماعة (‪:)non-greedy matching‬‬

‫هنا قمنا بكتابة نفس الكود البرمجي وكل ما غيرناه هو إضافة (?) الى التركيب القياسي لنجعله يتوقف عند اول نقطة‬

‫مطابقة لنهاية السلسلة المطلوبة وهكذا حصل‪.‬‬


‫‪70‬‬
‫المثال الخامس‪ :‬تركيز المطابقة حول رمز واحد‪:‬‬

‫هنا قلنا للمفسر قم بالبحث عن الرمز (@) وقبله على األقل رمز واحد ليس فراغ (‪ )non-whitespace‬وبعده على‬

‫األقل رمز واحد ليس فراغ (‪ )non-whitespace‬وقم بوضعه داخل المتغير (‪ )y‬ثم اطبعه‪.‬‬

‫المثال السادس‪ :‬لزيادة التركيز أكثر في نتائج المطابقة نستخدم االقواس () والتي تحدد بداية ونهاية الجزء المراد‬

‫ارجاعه كما في ادناه‪:‬‬

‫‪71‬‬
‫وهنا نالحظ ان ال (‪ )z‬على الرغم من انها تحتوي على الكثير من الرموز للمطابقة بداخلها اال ان ما ارجعته عبارة‬

‫الطباعة هو فقط ما كان محصوراً بين القوسين () وهو المطلوب لتضييق نطاق النتائج المرجعة‪.‬‬

‫المثال السابع‪:‬‬

‫‪72‬‬
‫المثال الثامن‪ :‬البحث بطريقة التجزئة المزدوجة (‪ :)double split‬وقد سبق التطرق الى هذه الطريقة وشرحها سابقا ً‬

‫المثال التاسع‪ :‬لتطبيق نفس المطلوب في المثال السابق باستخدام التعابير القياسية‪:‬‬

‫وللتوضيح الحظ الشرح التالي‪:‬‬

‫‪73‬‬
‫المثال العاشر‪ :‬خيارات أكثر للبحث والمطابقة‪:‬‬

‫‪74‬‬
‫الى هنا احبتي الكرام ينتهي الجزء الثاني من دورتنا المستمرة ان شاء هللا وقد تناولنا في هذه الدورة كل ما يتعلق بأدوات‬

‫االدخال واإلخراج واساسيات البرمجة بلغة بايثون ومعالجة البيانات الرقمية والنصية بكل الطرق الممكنة‪ .‬سيكون‬

‫تركيزنا في األجزاء القادمة من هذه الدورة ان شاء هللا على البرمجة للتطبيقات التفاعلية (‪)interactive applications‬‬

‫للحاسوب والهواتف النقالة ان شاء هللا وربما نصل الى مرحلة البرمجة للتطبيقات الموزعة عبر االنترنت (الشبكات)‬

‫وبرمجة مواقع االنترنت بلغة بايثون فتابعوا معنا كل جديد على مدونة مصطفى صادق العلمية على الرابط التالي‪:‬‬

‫‪75‬‬

You might also like