Coding for KidsCoding for Kids
שלבים יצירתייםאתגריםמדריך למורים
הצבע על תכונות
קורס פיתוח מתקדם בפייתון
פרק
>
רמה

מודולי מחרוזת וזמן
מודול ביטויים רגולריים

מטרה

ודא וארגן קבצים הקשורים לעובדים והקצאות אזוריות באמצעות ביטויים רגולריים.

במשרדים הסמוכים קיימת תיעוד שצריך לעדכן בנוגע לעובדים שמתחילים לעבוד בשדות החדשים ולחלוקת האזורים בהם מטפלים בגידולים ובבעלי חיים. ניהול קבצים יכול להיות די מסובך, במיוחד כאשר מטפלים בכמויות גדולות של טקסט. לשם כך נשתמש במודול re, שהוא קיצור של Regular Expressions המכונים גם 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 כדי לספור כמה פריטים קיימים ברשימה. פעולה זו תתריע לנו על מספר העובדים ב-manifest. השתמשו בפונקציה 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(). לאחר הגדרה זו, השתמשו במשתנה הוקטורי עם הפונקציה write() שהוכנה מראש.

הבא נעסוק בזיהוי פריטי האזוריות. לכו אל סימן ה-X הכהה על השטיח הירוק. צרו רשימה בשם sectors והשתמשו בפונקציה re.split() כדי לאגד את כל סקטורי האזוריות לרשימה. בפונקציית הפיצול, השתמשו בשרשרת המיוחדת "\D" כדי לשמר רק את המספרים מהמשתנה zones. השתמשו ב-list comprehension כדי להסיר כל מרווח ריק מהרשימה, על ידי שימוש בפונקציה 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 הבהיר. משתנים אלה משתמשים ב-list comprehension שעובר על כל הפריטים ברשימת sectors ומסננים אותם באמצעות הפונקציה re.match(). השתמשו במשתנים sector_a, sector_b, sector_c והכנסו אותם לפונקציה write() שהוכנה מראש כדי להשלים את הרמה.

ספר קוד