PracticU

RegEx in Python

בלי כתוביותעם כתוביות
PracticU › קורס פייתון - Python › RegEx in Python
מילון מושגים:
Python - שפת תכנות עילית וקריאה, נפוצה בפיתוח, אוטומציה, ניתוח נתונים ולמידת מכונה.
מחרוזת - סוג נתונים שמייצג רצף של תווים, כלומר טקסט, ומשמש לאחסון מילים, משפטים או כל רצף סימנים.
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.
Ping - פקודה שבודקת אם מכשיר ברשת מגיב ומודדת את זמן התגובה אליו.
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
כתובת IP - מספר שמזהה באופן ייחודי מכשיר ברשת מבוססת פרוטוקול IP, ומאפשר לשלוח אליו ולקבל ממנו מידע.
בנאי - מתודה מיוחדת שמופעלת אוטומטית בעת יצירת אובייקט ממחלקה, ומאתחלת את ערכיו ההתחלתיים.

RegEx in Python
ההרצאה מסבירה ביטויים רגולריים (regex) בפייתון: שפה קצרה לתיאור קבוצת מחרוזות לפי תבנית, ואיך משתמשים בה לבדיקת קלט, לחילוץ מידע מפלט של תוכנה ולעיבוד טקסט.
השלבים העיקריים
1. הרעיון: ביטוי רגולרי הוא מחרוזת שמתארת קבוצה של מחרוזות. המחרוזת ABC מתארת את עצמה, אבל גם כל רצף של תווים מ-A עד C שחוזר פעם אחת או יותר.
2. תווים מיוחדים: ^ מתאים לתחילת המחרוזת, $ לסופה, [a-z] לתו אחד מטווח, \d לספרה, \w לתו מילה ו-\s לרווח. הסוגריים העגולים מסמנים חלק שרוצים לתפוס.
3. כמתים: + משמעותו אחד או יותר, * אפס או יותר, ו-{3} משמעותו בדיוק שלוש פעמים. כך אפשר לתאר תאריך או מספר בעל אורך קבוע.
4. בדיקת כתובת אימייל: תבנית פשוטה מזהה רק חלק מהכתובות התקינות, למשל כאלה עם סיומת מורכבת כמו co.il. לכן ממליצים לבדוק את התבנית באתר כמו regex101, שמראה מה נתפס ומה לא.
5. בדיקת תאריך: תבנית לתאריך בפורמט יום/חודש/שנה מוודאת את טווח הספרות, אבל לא את תקינות התאריך עצמו, למשל חודש 15 או 32 יתקבלו.
6. פונקציות של המודול re: re.search מחפשת בכל המחרוזת ומחזירה את ההתאמה הראשונה. re.match בודקת רק מתחילת המחרוזת. re.findall מחזירה רשימה של כל ההתאמות, ו-re.finditer מחזירה איטרטור.
7. חילוץ נתונים: פלט של פקודת ping מנותח בעזרת תבנית עם סוגריים, והתוצאה הופכת לאובייקטים של מחלקה Ping עם כתובת IP וזמן.
איך זה עובד
ברירת המחדל של הכמתים היא חמדנית (greedy): הם מנסים לתפוס כמה שיותר. הנקודה-כוכבית .* תופסת עד סוף השורה ואז חוזרת אחורה עד שהתבנית מתאימה. בהרצאה נמדד שתבנית לא מדויקת עשתה 119 צעדים במקום 9, ולכן בקבצים גדולים ביצועים הם עניין חשוב.
פקודות והגדרות
- re.findall(r"(\d+)\.(\d+)", s)
- דגלים: re.IGNORECASE להתעלמות מאותיות גדולות וקטנות, re.MULTILINE לכמה שורות
- שמות לקבוצות: (?P<ip>...), ואז m.groupdict() מחזיר מילון
טעויות נפוצות
- שימוש ב-.* במקום תבנית מדויקת גורם להתאמות שגויות ולהאטה.
- search מחפש בכל המחרוזת, ו-match רק מההתחלה. מי ששוכח את ההבדל מקבל None.
- תבנית שנראית נכונה עלולה לקבל ערכים לא תקינים, ולכן כדאי לבדוק אותה על דוגמאות רבות.
שימו לב
בזכות המילון שמחזיר regex עם שמות לקבוצות אפשר להעביר אותו ישירות לבנאי של מחלקה בעזרת **, וכך מקבלים אובייקט מוכן בשורה אחת.

פרקי ההרצאה: RegEx in Python

  1. 00:00

    מהו ביטוי רגולרי ולמה משתמשים בו

  2. 01:17

    הגדרה מדויקת של רג'קס

  3. 01:53

    ולידציה של כתובת אימייל

  4. 03:08

    הסבר על הסימנים: מקף ופלוס

  5. 03:49

    תחילת וסוף מחרוזת: כובע ודולר

  6. 05:55

    פלוס וכוכבית: מספר ההופעות

  7. 08:55

    סוגריים מרובעות וטווחי תווים

  8. 10:51

    בדיקת תאריך בפורמט רג'קס

תמלול ההרצאה: RegEx in Python

הטקסט המלא של הדקות הראשונות בהרצאה «RegEx in Python» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    שלום לכולם, בשיעור הזה אנחנו נדבר על רג'קסים, ביטוי רגולרי. דבר ראשון, מה זה? למי שלא מכיר, אז ההגדרה הרשמית של ביטוי רגולרי, רג'קס, זה מכרוזת שמתארת קבוצת מכרוזות בעלת תחביר מסוים.

  2. 00:19

    זה נשמע לא מובן, אבל נראה לי שהכי טוב זה דוגמה. אם יש לי את המכרוזת ABC, איזה מכרוזת אחרת תתאר לי את ABC? אז ברור שהמכרוזת ABC תתאר לי את המכרוזת ABC, כי זו אותה מכרוזת.

  3. 00:39

    אבל האם יכולות להיות מחוזות אחרות שגם יתארו לי את ABC? התשובה היא כן, ותלוי בחוקים.

  4. 00:47

    כלומר, מה עוד מיוחד ב-ABC? ABC זה גם רצף של תווים מהאות A עד האות C. כלומר, יש לי פה רצף מ-A עד C, שהם חוזרים מספר מסוים של פעמים.

  5. 01:04

    אז גם זה מתאר את ה-ABC. עכשיו, האם זה מתאר את הרצף ABCD? התשובה היא לא. זה לא מתאר את ABCD, כי אני הגדרתי פה שזה יהיה רק A, אז בואו רגע נחזור על ההגדרה ונראה אם זה עכשיו מובן יותר.

  6. 01:19

    מה זה רג'קס? רג'קס זה מחרוזת, במקרה הזה המחרוזת היא a סוגר מרובה שמכין בתוכו a מקף c, סוגירת סוגר מרובה ופלוס, שמתארת מחרוזת אחת או יותר.

  7. 01:35

    אז המחרוזת a עד c פלוס, המחרוזת הזאת מתארת לי את המחרוזת a,b,c. היא גם מתארת לי את המחרוזת a,b,c,c ו-a,b,c,c,b ו-A, B, C, C, A, ו-A, ו-A, זאת אומרת היא מייצגת רצף מחוזות.

  8. 01:53

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

  9. 02:05

    נגיד יש אתר אינטרנט שמבקש שהמשתמש יכניס כתובת אימייל, נגיד [email protected]. עכשיו אני רוצה לדעת האם המשתמש הכניס לי פה משהו שהוא באמת כתובת אימייל.

  10. 02:18

    אני יכול להגיד, אוקיי, אני מצפה שיהיה לי פה a עד z, איזשהו שטרודל באמצע, אז עוד איזשהו a עד z, נקודה, ואז עוד איזשהו domain a עד z.

  11. 02:38

    עכשיו, כמובן שכל הביטוי הרגולרי שכתבתי עכשיו הוא לא תקין, מהסיבה הפשוטה שאם אני אחליף את זה לנקודה co.il זה עדיין אימייל ולידי, אבל הרג'קס שלי לא תופס אותו, כפי שאתם רואים באתר המעולה הזה שנקרא רג'קס 100.

  12. 02:56

    אני מאוד ממליץ בו להשתמש כשכותבים ביטויים רגולריים. אנחנו רואים בדיוק מה הביטוי שלנו תפס ומה הוא לא תפס. עכשיו אני קצת רצתי קדימה ותוך כדי אני חוזר אחורה ומסביר כי באמת לא הסברתי מה זה המקף ומה זה הפלוס.

  13. 03:15

    עכשיו אנחנו נעבור על כל האופציות ונסביר הכל כי באמת זה משהו שהוא מאוד קל להבין אותו עם דוגמה אבל צריך להסביר אחר כך את הדוגמה. דבר ראשון, מה שאנחנו רואים פה בכחול זה מה שתפסנו.

  14. 03:28

    כלומר הביטוי הרגולרי שלנו תופס רק עד לכאן. אם אני רוצה לתפוס גם עד לכאן, אז נגיד אם אני אוסיף פה נקודה ו-il, אתם תראו שהוא תפס את הכל. אבל בואו רגע נחזור רגע אחורה ונדבר על החוקים.

  15. 03:45

    בואו נתחיל מהדברים הכי פשוטים. כדי למצוא התאמה לתחילת סטרינג, משתמשים בדולר. יש פה עכשיו הרבה הרבה הרבה פירוט, פשוט תראו, תזכרו, נראה דוגמאות בהמשך, אבל באמת פשוט רצף של דברים שאין בהם היגיון.

  16. 04:02

    כמו שיש לנו טעות א' וטעות ב' בעברית, פשוט ככה זה, גם שפת רג'ק זה שפה שהגדירו, אין בה היגיון, פשוט ככה הגדירו אותה. אז דולר מייצג סוף סטרינג, הסימן הזה חזקה או כובע מייצג תחילת סטרינג, יש לנו פלוסים, יש לנו כוכביות, יש לנו סוגריים עגולות שגם יש להם משמעות מיוחדת,

  17. 04:31

    סוגריים מרובעות שגם יש להם משמעות מיוחדת, יש לנו את הסימן הזה שעושים אותו עם שיפט, הסימן ליד האנטר במקש, אני תכף אראה לכם. הסימן pipe זה הסימן במקרה שנמצא ליד האנטר, שיפט והמקש הזה עושה לי את הדבר הזה.

  18. 04:53

    ב-C ו-C++ זה עושה אור, וגם בפייתון זה עושה אור בינארי. עכשיו בואו נתחיל לדבר פה על הדברים האלה. שמנו את כל הדברים האלה בצד, יש לנו את הסטרינג ABCD. אני רוצה למצוא התאמה לסטרינג ABCD. אז דבר ראשון אמרנו תחילת סטרינג זה כובע, אז כובע.

  19. 05:18

    אחרי זה אני רוצה ABCD ואחרי זה סוף סטרינג דולר. עכשיו, הסיבה שאנחנו כבר איבדנו את ההתאמה זה בגלל כל הדברים האלה. אם אני אמחק אותם, אתם תראו שזה כן עובד.

  20. 05:42

    כלומר, כובע בעצם מסמן את תחילת הסטרינג שלי ודולר מסמן לי את סוף הסטרינג שלי. מכיוון שסוף הסטרינג שלי פה הוא פייפ, אז ברגע שהוספתי פה את הדולר כבר הביטוי הרגולרי שלי לא מתאים לטקסט שנמצא פה.

  21. 06:02

    עכשיו, בואו נדבר על הסימנים הבאים, פלוס וכוכבית. פלוס וכוכבית בדרך כלל באים אחרי או סוגריים מרובעות שמכילות בתוכם דברים, או סתם איזשהו a או סתם איזשהו מספר.

  22. 06:16

    נגיד יש לי את הרצף תווים a, a, a, a, אז אני יכול לכתוב a פלוס. מה זה אומר a פלוס? זה אומר שיש a אחד לפחות או יותר. כלומר, אם יש לי פה b, אז זה לא יתפוס, כי אין לי פה a אחד לפחות.

  23. 06:37

    עכשיו, מה זה a כוכבית? A כוכבית אומר שאני חייב, שאני יכול שיהיה לי A או שלא יהיה לי A. עכשיו בואו נמשיך אבל עכשיו עם Output יותר טוב.

  24. 06:57

    אז עשיתי פה איזשהו דיר במכונה שלי באיזושהי תקייה ויש לי פה עכשיו סטרינגים. יש לי פה עכשיו את ה-Output של דיר ואני רוצה עכשיו להריץ עליו כמה ביטויים רגולריים.

  25. 07:09

    אז בואו נמשיך בעוד כמה כללים לפני שנמשיך לפלוסים ולכוכביות. יש לי מכף d, מכף d זה אומר כל מספר, כפי שאתם רואים פה בצד ימין, הוא גם רושם match a digit 0 or 9, זאת אומרת כל מספר בין 0 ל-9 בודד.

  26. 07:29

    אם אני רוצה לתפוס יותר ממספר 1, הוא פשוט יכול להוסיף פלוס, ואז הוא מנסה לתפוס כמה שיותר ספרות. עכשיו, אם אני אחליף את זה לכוכבית, הוא יתפוס לי גם כמו פלוס, כי זה מתחיל במספר.

  27. 07:44

    אבל אם היה לי פה a, אז זה לא היה תופס. אם היה לי פה תו, זה לא היה תופס. עכשיו בואו נעבור לסלאש הבא, הסלאש הבא זה W. W תופס לי או מספר או A עד Z או A עד Z גדולות.

  28. 08:07

    עכשיו על הדרך אני אכניס פה משהו שנקרא גלובל. גלובל אומר, גלובל במקרה הזה, אני חושב שיהיה יותר נוח לדוגמה הבאה, אומר שהוא תופס את, הוא מנסה כל פעם להריץ את הדבר הזה, כלומר מכל מקום שהוא מתאים לו הוא מתחיל להריץ את הבדיקה של הרג'קס.

  29. 08:33

    בואו ננסה עכשיו לכתוב איזשהו לפני כן עוד דבר אחד, יש לנו את ה-backslash s. backslash s הוא מתאים, תופס רווחים. כלומר, או backslash, או תאבים, או שורה חדשה.

  30. 08:47

    ופלוס שלו תופס גם, פלוס וכוכבית, תופס גם כן הרבה ספייסים או הרבה תאבים. דבר נוסף שאני רוצה להגיד זה סוגריים מרובעות. סוגריים מרובעות זה תופס כמה דברים.

  31. 09:02

    למשל, אני רוצה לתפוס את המספרים 0, חמש את התו סלאש ואני רוצה לתפוס כמה כאלה אז אני אשים פה פלוס עכשיו אם אני אוסיף פה שתיים אז הוא יתפוס לי עד שש עשרה אחד הוא יוסיף אחד שש הוא יתפוס לי גם את זה עכשיו אם אני אמחק את כל המספרים אני יכול לעשות פה סלאש די ואז הוא בעצם עושה פלוסים לסלאש די ולסלאשים אז הוא תפס בעצם את כל הרצף הראשון הזה למה הוא עצר פה הוא עצר פה כי פה יש לי

  32. 09:35

    ספייס וספייס לא נמצא בתוך הביטוי הרגולרי הזה כשאני אומר תפס אז זה אומר שהביטוי הרגולרי הזה מתאים לסטרינג הזה, ויש אופציה דרך פייתון, ובעצם דרך הרבה שפות תכנות, כל שפת תכנות פחות או יותר,

  33. 09:53

    להגיד לפייתון או לשפת התכנות הזאת, תיקח את הסטרינג הזה, שהסטרינג הזה הוא מייצג לי את כל האוטפוט של דיר, תיקח את הביטוי הרגולרי שלי, ותחזיר לי את המצ'ינג, תחזיר לי את מה שהוא התאים לו.

  34. 10:07

    זה מה שאני אומר שהוא תפס. לחלופין, הטפס יכול להיות שאני מבקש מהמשתמש שיכניס אינפוט באיזשהו פורמט של תאריך כמו זה, ואני בודק שהפורמט הזה מתאים לי, ואז אני יכול לתת לו אוקיי או שאני יכול להקפיץ לו שגיאה?

  35. 10:24

    לא, זה לא הפורמט שביקשתי ממך להקליד. עכשיו, במקרה הזה הוא יתפוס הרבה פורמטים אחרים שהם לא תקינים כמו זה, וזה באמת לא תאריך תקין. לא תאריך תקין.

  36. 10:35

    אז חשוב לב שכותבים ביטוי רגולרי, באמת לבדוק אותו טוב טוב. עכשיו בואו נמשיך עוד קצת עם עוד כל מיני אופציות של ביטויים רגולריים.

  37. 10:46

    בואו נגיד שאני רוצה לתפוס שלוש ספרות, אך ורק שלוש ספרות. אז כל מה שצריך לעשות זה backslash d, אז בסוגריים לסולסלות אני כותב כמה מהם אני רוצה לתפוס.

  38. 11:04

    אני יכול גם בסוגריים לסולסלות להגיד לו טווח 3, רגע, ועושים את זה עם פסיקים.

  39. 11:18

    והדבר הזה תופס לי בין מספר 1 לבין 3 מספרים, זאת אומרת שהוא יתפוס לי גם את 1, 2 וגם את 1. שימו לב שאם אני כותב slash d ואז רק שלוש זה בעצם כמו לכתוב slash d slash d slash d אז זאת דרך לתפוס מספר מושלם של מספרים בין שתיים לבין ארבע שימו לב שהוא תמיד רג'קס הוא בדרך כלל איגר כלומר הוא ינסה לתפוס את המקסימום שהוא

  40. 11:46

    יכול בואו ננסה לכתוב איזשהו ביטוי רגולרי שיתפוס לי את יתאים לי שורה שורה אז דבר ראשון אנחנו מתחילים מאיזשהו מספר אחרי זה יש לנו slash אחרי זה יש לנו עוד מספר 9, ואחרי זה יש לנו עוד מספר.

  41. 12:21

    עכשיו, אם הייתי באמת רוצה לוודא שזה תאריך, אז הייתי עושה כזה דבר. -05 זה החודש, זאת אומרת שזה יכול להיות או 1 או 2, סליחה, או 0 או 1, וחייב להיות בדיוק 2 כאלה, ואחר מכן צריך להיות לי את המספר בין 1, בין 0 ל-9, וגם חייב להיות לי בדיוק 1 כזה. זה בעצם מוודא שאם יש לי פה 35 זה לא ייתפס כי 35 זה לא מספר ולידי של

  42. 13:04

    יום בחודש זה בעצם תופס לי את כל המספרים שזה בעצם מייצג את המספר הראשון בשם של חודש מלא שיכול להיות או 0 או 1 זה בעצם מייצג את המספר השני בשם של החודש זה בעצם המספר חודש סליחה לא התאריך בחודש עכשיו לאחר מכן יש לנו סלאש ופה יש לי עוד פעם אני צריך למצוא פה איזשהו מספר כאשר המספר יכול להיות לי בין 0 ל-3 וצריך להיות לי בדיוק אחד כזה.

  43. 13:38

    לאחר מכן, המספר השני של החודש יכול להיות לי בין 0 ל-9, וצריך להיות לי בדיוק אחד כזה. לאחר מכן יש לי סלאש. לאחר מכן המספר יכול להיות לי, בהנחה שאנחנו מדברים על שנות 1000 ו-2000, ואנחנו לא כותבים פה תוכנה שתרוץ בשנת 3000, שזה יכול להיות, פג 2000 וכו', אז אנחנו רוצים או אחד או שתיים,

  44. 14:11

    בדיוק אחד כזה. לאחר מכן פה אנחנו נהיה קצת יותר בררנים פחות בררנים פה ניתן למספרים 0 16 אנחנו רוצים את המספרים בעצם 0 עד 9 ושלוש פעמים זה בעצם רג'קס הכי טוב שאפשר לכתוב לתפוס את הדבר הזה כי כל חריגה הכי קטנה דופקת אותו רגע שנכתוב פה 40 אפילו 30 ו32 זה לא טוב יש לי פה טעות זה, יש פה פשלה קטנה של 32 זה באמת יתפוס,

  45. 14:55

    ואין באמת יום של 32. צריך לחשוב איך לתקן

לקורס המלא: קורס פייתון אונליין למתחילים

ההרצאה הקודמת: process

הרצאות קשורות מקורסים אחרים

  • RegEx in JavaScript
  • התקנה של Git ו-Python

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס PHP - פרויקט מעשי