Coding for KidsCoding for Kids
المستويات الإبداعيةالتحدياتدليل المعلم
صوت للميزات
دورة تطوير بايثون المتقدمة
الفصل
>
المستوى

وحدات السلاسل والوقت
وحدة التعبيرات النظامية

الهدف

التأكد من تنظيم الملفات الخاصة بالموظفين وتخصيص المناطق باستخدام التعبيرات النمطية.

في المكاتب المجاورة توجد بعض الوثائق التي تحتاج إلى تحديث بخصوص الموظفين الذين سيبدؤون عملهم في الأراضي الزراعية الجديدة وتوزيع المناطق للعناية بالمحاصيل والماشية. يمكن أن يكون إدارة الملفات أمرًا معقدًا، خاصة عند التعامل مع كميات كبيرة من النصوص. لهذا الغرض سنستخدم وحدة re، وهي اختصار للتعبيرات النظامية والمشار إليها أيضًا باسم Regex. يمكننا الوصول إلى وظائفها باستخدام import re، ولأغراض هذا المستوى سنستخدم الوظائف التالية:

  • re.findall(): تُرجع قائمة بكل الحالات التي يظهر فيها نص معين. تأخذ وسيطين (2)، الأول هو الحروف التي تبحث عنها في النص، والثاني هو النص الذي تبحث فيه.
  • re.sub(): تستبدل ظهور نص معين بنص آخر. تأخذ ثلاث (3) وسيطات، الأول هو الحروف التي ترغب في استبدالها، الثاني هو النص الذي تريد الاستبدال به، والثالث هو النص الذي تبحث فيه.
  • re.search(): تجد موقع شيئ ما في النص، وتعيد كائنًا. تأخذ وسيطين (2)، الحروف التي تبحث عنها والنص الذي تبحث فيه. يمكنك استخدام وظائف أخرى مع الكائن المُعاد مثل span() التي تُرجع متجهًا يحدد موضع بداية ونهاية العنصر الذي تم البحث عنه في النص.
  • re.split(): تقسم النص إلى قائمة عند فواصل محددة. تأخذ وسيطين (2)، الأول هو المكان الذي يتم فيه تقسيم النص، والثاني هو النص الذي ترغب في تقسيمه.
  • re.match(): تتحقق مما إذا كان النص يحتوي على قيمة معينة في بدايته. تعمل مثل نسخة مبسطة من دالة re.search() ولكنها أكثر كفاءة وتتحقق مما إذا كان النص الذي تبحث فيه يبدأ بالاستعلام.

يمكن لوحدة re أيضًا استخدام تسلسلات خاصة، حيث توجد أكواد يمكنك استخدامها مع دوال re والتي تسمح لك بتغطية مجموعة متنوعة من خصائص النص. هناك قائمة طويلة من التسلسلات الخاصة ولكن لهذا المستوى سنستخدم ما يلي:

  • \B: تتحقق مما إذا كانت الحروف المحددة موجودة في النص ولكنها ليست في بداية أو نهاية كلمة.
  • \D: تُرجع الحروف التي ليست أرقامًا من 0-9

إذا كان هناك حرف r مع تسلسل خاص، فهذا يعني أنه يتم التحقق من النص الخام.

ابدأ بالسير نحو علامة X الذهبية ومواجهة الطاولة التي عليها المذكرة، استخدم دالة read() للتحقق من المذكرة التي تحتوي على قائمة جرد لكل الموظفين. كل اسم يحتوي على # يفصل رقم الموظف الخاص به، كما أن النص الذي يحتوي على الأسماء مخزن أيضًا في ثابت يسمى manifest.

أنشئ قائمة باسم tags وخزن قيمة re.findall()، المستخدمة للبحث عن كل # في ثابت manifest، على النحو التالي: tags = re.findall("#", manifest) . أنشئ متغيرًا باسم number واستخدم len() مع قائمة tags لحساب عدد العناصر في القائمة، وهذا سيسمح لنا بمعرفة عدد الموظفين في قائمة الجرد. استخدم دالة speak() مع المتغير number للإعلان عن عدد الأسماء الموجودة في القائمة.

التالي، انتقل إلى علامة X الفاتحة بجوار السجادة الزرقاء وواجه المكتب واستخدم دالة read(). هنا سيكون لديك قائمة بالموظفين الجدد مع المناصب المعينة لهم. قم بتدوين أسماء الأشخاص في كل مهنة لتتمكن من المقارنة مع الأشخاص المعينين حاليًا. انتقل إلى علامة X على السجادة الزرقاء واستخدم read() مرة أخرى للتحقق من الوظائف المعينة حاليًا.

يتم تخزين القوى العاملة الحالية في ثابت يسمى assignments، ويجب تحديث هذه الوثيقة بالمعلومات الموجودة في قائمة التعيينات الجديدة. قم باستبدال الأسماء المختلفة في القائمة باستخدام دالة re.sub() لاستبدال جزء من النص بآخر. على سبيل المثال، أحد التعديلات هو كما يلي:

assignments = re.sub("Billy Hodgins", "Carol Hopkins", assignments)

يتم استبدال الاسم "Billy Hodgins" بـ "Carol Hopkins" في الوثيقة. بالإضافة إلى هذا التغيير، قم بمسح الوثيقة وتحديث هذا الاسم واسم آخر من القائمة لتحديث الوثيقة بالكامل. استخدم دالة write() مع assignments للتحقق من النتائج.

الآن بعد أن انتهينا من قوائم الموظفين حان الوقت للانتقال إلى تقسيم المناطق في المزرعة. انتقل إلى علامة X الداكنة على السجادة الحمراء واستخدم دالة read()، سيُظهر لك هذا مراجعة تفصيلية لتقسيم المناطق. يتم تخزين هذه المعلومات في ثابت يسمى zones.

ومن الجدير بالذكر أنه من المهم تحديد موقع 6210 في الوثيقة حيث أن المنطقة تحتاج إلى إعادة تقييم. للقيام بذلك، نحتاج إلى استخدام دالة re.search() لتحديد موقع رقم القطاع في تقسيم المناطق. أنشئ متغيرًا باسم index وخزن كائن البحث، واضبط البحث على r"6210\B". ما يقوم به هذا هو أن r يبحث عن نص خام، و6210 هو رقم القطاع الذي نبحث عنه، و\B هو معيار التسلسل الخاص بالبحث. يتم ذلك كما يلي: index = re.search(r"6210\B", zones) .

الآن بعد أن يحمل index كائن البحث، حان الوقت لاستخراج البيانات منه باستخدام span(). أنشئ متغيرًا باسم vector وخزن موقع كائن البحث، كما يلي: vector = index.span() . بمجرد الانتهاء، استخدم متغير vector مع دالة write() المكتوبة مسبقًا.

بعد ذلك سنعمل على تحديد عناصر تقسيم المناطق. انتقل إلى علامة X الداكنة على السجادة الخضراء. أنشئ قائمة باسم sectors واستخدم دالة re.split() لتجميع جميع قطاعات تقسيم المناطق المختلفة في قائمة. في دالة التقسيم، استخدم التسلسل الخاص "\D" لالتقاط الأرقام فقط من متغير zones. استخدم تعبير قائمة لإزالة أي مسافات فارغة من القائمة باستخدام دالة len() لإزالة العناصر التي تكون قصيرة جدًا لتكون رقم قطاع. كما يلي:

sectors = re.split("\D", zones) sectors = [x for x in sectors if len(x) > 3]

استخدم zones مع دوال write() لتدوين جميع قطاعات تقسيم المناطق.

انتقل إلى علامة X الفاتحة بجوار السجادة البنفسجية وواجه خزانة الملفات، استخدم دالة read() للتحقق من قطاعات الأولوية في تقسيم مناطق الأراضي الزراعية. قم بتدوين القطاعات حيث نحتاج للتأكد مما إذا كانت هذه القطاعات موجودة في قائمة القطاعات.

انتقل إلى علامة X الداكنة على السجادة البنفسجية، هناك ثلاثة (3) قطاعات ذات أولوية في المتغيرات المسماة: sector_a، sector_b، sector_c، مكتوبة مسبقًا في محرري الكود، أدخل القيم التي قرأتها من علامة X الفاتحة. تستخدم هذه المتغيرات تعبير قائمة يمر عبر جميع العناصر في قائمة sectors ويقوم بتصفيتها باستخدام دالة re.match(). استخدم المتغيرات sector_a، sector_b، sector_c وأدخلها في دالة write() المكتوبة مسبقًا لإكمال المستوى.

كتاب الكود