
ABC מתארת את עצמה, אבל גם כל רצף של תווים מ-A עד C שחוזר פעם אחת או יותר.^ מתאים לתחילת המחרוזת, $ לסופה, [a-z] לתו אחד מטווח, \d לספרה, \w לתו מילה ו-\s לרווח. הסוגריים העגולים מסמנים חלק שרוצים לתפוס.+ משמעותו אחד או יותר, * אפס או יותר, ו-{3} משמעותו בדיוק שלוש פעמים. כך אפשר לתאר תאריך או מספר בעל אורך קבוע.co.il. לכן ממליצים לבדוק את התבנית באתר כמו regex101, שמראה מה נתפס ומה לא.re.search מחפשת בכל המחרוזת ומחזירה את ההתאמה הראשונה. re.match בודקת רק מתחילת המחרוזת. re.findall מחזירה רשימה של כל ההתאמות, ו-re.finditer מחזירה איטרטור.ping מנותח בעזרת תבנית עם סוגריים, והתוצאה הופכת לאובייקטים של מחלקה Ping עם כתובת IP וזמן..* תופסת עד סוף השורה ואז חוזרת אחורה עד שהתבנית מתאימה. בהרצאה נמדד שתבנית לא מדויקת עשתה 119 צעדים במקום 9, ולכן בקבצים גדולים ביצועים הם עניין חשוב.re.findall(r"(\d+)\.(\d+)", s)re.IGNORECASE להתעלמות מאותיות גדולות וקטנות, re.MULTILINE לכמה שורות(?P<ip>...), ואז m.groupdict() מחזיר מילון.* במקום תבנית מדויקת גורם להתאמות שגויות ולהאטה.search מחפש בכל המחרוזת, ו-match רק מההתחלה. מי ששוכח את ההבדל מקבל None.**, וכך מקבלים אובייקט מוכן בשורה אחת.הטקסט המלא של הדקות הראשונות בהרצאה «RegEx in Python» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם, בשיעור הזה אנחנו נדבר על רג'קסים, ביטוי רגולרי. דבר ראשון, מה זה? למי שלא מכיר, אז ההגדרה הרשמית של ביטוי רגולרי, רג'קס, זה מכרוזת שמתארת קבוצת מכרוזות בעלת תחביר מסוים.
זה נשמע לא מובן, אבל נראה לי שהכי טוב זה דוגמה. אם יש לי את המכרוזת ABC, איזה מכרוזת אחרת תתאר לי את ABC? אז ברור שהמכרוזת ABC תתאר לי את המכרוזת ABC, כי זו אותה מכרוזת.
אבל האם יכולות להיות מחוזות אחרות שגם יתארו לי את ABC? התשובה היא כן, ותלוי בחוקים.
כלומר, מה עוד מיוחד ב-ABC? ABC זה גם רצף של תווים מהאות A עד האות C. כלומר, יש לי פה רצף מ-A עד C, שהם חוזרים מספר מסוים של פעמים.
אז גם זה מתאר את ה-ABC. עכשיו, האם זה מתאר את הרצף ABCD? התשובה היא לא. זה לא מתאר את ABCD, כי אני הגדרתי פה שזה יהיה רק A, אז בואו רגע נחזור על ההגדרה ונראה אם זה עכשיו מובן יותר.
מה זה רג'קס? רג'קס זה מחרוזת, במקרה הזה המחרוזת היא a סוגר מרובה שמכין בתוכו a מקף c, סוגירת סוגר מרובה ופלוס, שמתארת מחרוזת אחת או יותר.
אז המחרוזת a עד c פלוס, המחרוזת הזאת מתארת לי את המחרוזת a,b,c. היא גם מתארת לי את המחרוזת a,b,c,c ו-a,b,c,c,b ו-A, B, C, C, A, ו-A, ו-A, זאת אומרת היא מייצגת רצף מחוזות.
למה זה טוב בעצם ביטוי רגולרי? אז ביטויים רגולריים נמצאים במלא מקומות בעולם התכנות. המקומות הכי ברורים מאליהם זה ולידציה של מידע של המשתמש.
נגיד יש אתר אינטרנט שמבקש שהמשתמש יכניס כתובת אימייל, נגיד [email protected]. עכשיו אני רוצה לדעת האם המשתמש הכניס לי פה משהו שהוא באמת כתובת אימייל.
אני יכול להגיד, אוקיי, אני מצפה שיהיה לי פה a עד z, איזשהו שטרודל באמצע, אז עוד איזשהו a עד z, נקודה, ואז עוד איזשהו domain a עד z.
עכשיו, כמובן שכל הביטוי הרגולרי שכתבתי עכשיו הוא לא תקין, מהסיבה הפשוטה שאם אני אחליף את זה לנקודה co.il זה עדיין אימייל ולידי, אבל הרג'קס שלי לא תופס אותו, כפי שאתם רואים באתר המעולה הזה שנקרא רג'קס 100.
אני מאוד ממליץ בו להשתמש כשכותבים ביטויים רגולריים. אנחנו רואים בדיוק מה הביטוי שלנו תפס ומה הוא לא תפס. עכשיו אני קצת רצתי קדימה ותוך כדי אני חוזר אחורה ומסביר כי באמת לא הסברתי מה זה המקף ומה זה הפלוס.
עכשיו אנחנו נעבור על כל האופציות ונסביר הכל כי באמת זה משהו שהוא מאוד קל להבין אותו עם דוגמה אבל צריך להסביר אחר כך את הדוגמה. דבר ראשון, מה שאנחנו רואים פה בכחול זה מה שתפסנו.
כלומר הביטוי הרגולרי שלנו תופס רק עד לכאן. אם אני רוצה לתפוס גם עד לכאן, אז נגיד אם אני אוסיף פה נקודה ו-il, אתם תראו שהוא תפס את הכל. אבל בואו רגע נחזור רגע אחורה ונדבר על החוקים.
בואו נתחיל מהדברים הכי פשוטים. כדי למצוא התאמה לתחילת סטרינג, משתמשים בדולר. יש פה עכשיו הרבה הרבה הרבה פירוט, פשוט תראו, תזכרו, נראה דוגמאות בהמשך, אבל באמת פשוט רצף של דברים שאין בהם היגיון.
כמו שיש לנו טעות א' וטעות ב' בעברית, פשוט ככה זה, גם שפת רג'ק זה שפה שהגדירו, אין בה היגיון, פשוט ככה הגדירו אותה. אז דולר מייצג סוף סטרינג, הסימן הזה חזקה או כובע מייצג תחילת סטרינג, יש לנו פלוסים, יש לנו כוכביות, יש לנו סוגריים עגולות שגם יש להם משמעות מיוחדת,
סוגריים מרובעות שגם יש להם משמעות מיוחדת, יש לנו את הסימן הזה שעושים אותו עם שיפט, הסימן ליד האנטר במקש, אני תכף אראה לכם. הסימן pipe זה הסימן במקרה שנמצא ליד האנטר, שיפט והמקש הזה עושה לי את הדבר הזה.
ב-C ו-C++ זה עושה אור, וגם בפייתון זה עושה אור בינארי. עכשיו בואו נתחיל לדבר פה על הדברים האלה. שמנו את כל הדברים האלה בצד, יש לנו את הסטרינג ABCD. אני רוצה למצוא התאמה לסטרינג ABCD. אז דבר ראשון אמרנו תחילת סטרינג זה כובע, אז כובע.
אחרי זה אני רוצה ABCD ואחרי זה סוף סטרינג דולר. עכשיו, הסיבה שאנחנו כבר איבדנו את ההתאמה זה בגלל כל הדברים האלה. אם אני אמחק אותם, אתם תראו שזה כן עובד.
כלומר, כובע בעצם מסמן את תחילת הסטרינג שלי ודולר מסמן לי את סוף הסטרינג שלי. מכיוון שסוף הסטרינג שלי פה הוא פייפ, אז ברגע שהוספתי פה את הדולר כבר הביטוי הרגולרי שלי לא מתאים לטקסט שנמצא פה.
עכשיו, בואו נדבר על הסימנים הבאים, פלוס וכוכבית. פלוס וכוכבית בדרך כלל באים אחרי או סוגריים מרובעות שמכילות בתוכם דברים, או סתם איזשהו a או סתם איזשהו מספר.
נגיד יש לי את הרצף תווים a, a, a, a, אז אני יכול לכתוב a פלוס. מה זה אומר a פלוס? זה אומר שיש a אחד לפחות או יותר. כלומר, אם יש לי פה b, אז זה לא יתפוס, כי אין לי פה a אחד לפחות.
עכשיו, מה זה a כוכבית? A כוכבית אומר שאני חייב, שאני יכול שיהיה לי A או שלא יהיה לי A. עכשיו בואו נמשיך אבל עכשיו עם Output יותר טוב.
אז עשיתי פה איזשהו דיר במכונה שלי באיזושהי תקייה ויש לי פה עכשיו סטרינגים. יש לי פה עכשיו את ה-Output של דיר ואני רוצה עכשיו להריץ עליו כמה ביטויים רגולריים.
אז בואו נמשיך בעוד כמה כללים לפני שנמשיך לפלוסים ולכוכביות. יש לי מכף d, מכף d זה אומר כל מספר, כפי שאתם רואים פה בצד ימין, הוא גם רושם match a digit 0 or 9, זאת אומרת כל מספר בין 0 ל-9 בודד.
אם אני רוצה לתפוס יותר ממספר 1, הוא פשוט יכול להוסיף פלוס, ואז הוא מנסה לתפוס כמה שיותר ספרות. עכשיו, אם אני אחליף את זה לכוכבית, הוא יתפוס לי גם כמו פלוס, כי זה מתחיל במספר.
אבל אם היה לי פה a, אז זה לא היה תופס. אם היה לי פה תו, זה לא היה תופס. עכשיו בואו נעבור לסלאש הבא, הסלאש הבא זה W. W תופס לי או מספר או A עד Z או A עד Z גדולות.
עכשיו על הדרך אני אכניס פה משהו שנקרא גלובל. גלובל אומר, גלובל במקרה הזה, אני חושב שיהיה יותר נוח לדוגמה הבאה, אומר שהוא תופס את, הוא מנסה כל פעם להריץ את הדבר הזה, כלומר מכל מקום שהוא מתאים לו הוא מתחיל להריץ את הבדיקה של הרג'קס.
בואו ננסה עכשיו לכתוב איזשהו לפני כן עוד דבר אחד, יש לנו את ה-backslash s. backslash s הוא מתאים, תופס רווחים. כלומר, או backslash, או תאבים, או שורה חדשה.
ופלוס שלו תופס גם, פלוס וכוכבית, תופס גם כן הרבה ספייסים או הרבה תאבים. דבר נוסף שאני רוצה להגיד זה סוגריים מרובעות. סוגריים מרובעות זה תופס כמה דברים.
למשל, אני רוצה לתפוס את המספרים 0, חמש את התו סלאש ואני רוצה לתפוס כמה כאלה אז אני אשים פה פלוס עכשיו אם אני אוסיף פה שתיים אז הוא יתפוס לי עד שש עשרה אחד הוא יוסיף אחד שש הוא יתפוס לי גם את זה עכשיו אם אני אמחק את כל המספרים אני יכול לעשות פה סלאש די ואז הוא בעצם עושה פלוסים לסלאש די ולסלאשים אז הוא תפס בעצם את כל הרצף הראשון הזה למה הוא עצר פה הוא עצר פה כי פה יש לי
ספייס וספייס לא נמצא בתוך הביטוי הרגולרי הזה כשאני אומר תפס אז זה אומר שהביטוי הרגולרי הזה מתאים לסטרינג הזה, ויש אופציה דרך פייתון, ובעצם דרך הרבה שפות תכנות, כל שפת תכנות פחות או יותר,
להגיד לפייתון או לשפת התכנות הזאת, תיקח את הסטרינג הזה, שהסטרינג הזה הוא מייצג לי את כל האוטפוט של דיר, תיקח את הביטוי הרגולרי שלי, ותחזיר לי את המצ'ינג, תחזיר לי את מה שהוא התאים לו.
זה מה שאני אומר שהוא תפס. לחלופין, הטפס יכול להיות שאני מבקש מהמשתמש שיכניס אינפוט באיזשהו פורמט של תאריך כמו זה, ואני בודק שהפורמט הזה מתאים לי, ואז אני יכול לתת לו אוקיי או שאני יכול להקפיץ לו שגיאה?
לא, זה לא הפורמט שביקשתי ממך להקליד. עכשיו, במקרה הזה הוא יתפוס הרבה פורמטים אחרים שהם לא תקינים כמו זה, וזה באמת לא תאריך תקין. לא תאריך תקין.
אז חשוב לב שכותבים ביטוי רגולרי, באמת לבדוק אותו טוב טוב. עכשיו בואו נמשיך עוד קצת עם עוד כל מיני אופציות של ביטויים רגולריים.
בואו נגיד שאני רוצה לתפוס שלוש ספרות, אך ורק שלוש ספרות. אז כל מה שצריך לעשות זה backslash d, אז בסוגריים לסולסלות אני כותב כמה מהם אני רוצה לתפוס.
אני יכול גם בסוגריים לסולסלות להגיד לו טווח 3, רגע, ועושים את זה עם פסיקים.
והדבר הזה תופס לי בין מספר 1 לבין 3 מספרים, זאת אומרת שהוא יתפוס לי גם את 1, 2 וגם את 1. שימו לב שאם אני כותב slash d ואז רק שלוש זה בעצם כמו לכתוב slash d slash d slash d אז זאת דרך לתפוס מספר מושלם של מספרים בין שתיים לבין ארבע שימו לב שהוא תמיד רג'קס הוא בדרך כלל איגר כלומר הוא ינסה לתפוס את המקסימום שהוא
יכול בואו ננסה לכתוב איזשהו ביטוי רגולרי שיתפוס לי את יתאים לי שורה שורה אז דבר ראשון אנחנו מתחילים מאיזשהו מספר אחרי זה יש לנו slash אחרי זה יש לנו עוד מספר 9, ואחרי זה יש לנו עוד מספר.
עכשיו, אם הייתי באמת רוצה לוודא שזה תאריך, אז הייתי עושה כזה דבר. -05 זה החודש, זאת אומרת שזה יכול להיות או 1 או 2, סליחה, או 0 או 1, וחייב להיות בדיוק 2 כאלה, ואחר מכן צריך להיות לי את המספר בין 1, בין 0 ל-9, וגם חייב להיות לי בדיוק 1 כזה. זה בעצם מוודא שאם יש לי פה 35 זה לא ייתפס כי 35 זה לא מספר ולידי של
יום בחודש זה בעצם תופס לי את כל המספרים שזה בעצם מייצג את המספר הראשון בשם של חודש מלא שיכול להיות או 0 או 1 זה בעצם מייצג את המספר השני בשם של החודש זה בעצם המספר חודש סליחה לא התאריך בחודש עכשיו לאחר מכן יש לנו סלאש ופה יש לי עוד פעם אני צריך למצוא פה איזשהו מספר כאשר המספר יכול להיות לי בין 0 ל-3 וצריך להיות לי בדיוק אחד כזה.
לאחר מכן, המספר השני של החודש יכול להיות לי בין 0 ל-9, וצריך להיות לי בדיוק אחד כזה. לאחר מכן יש לי סלאש. לאחר מכן המספר יכול להיות לי, בהנחה שאנחנו מדברים על שנות 1000 ו-2000, ואנחנו לא כותבים פה תוכנה שתרוץ בשנת 3000, שזה יכול להיות, פג 2000 וכו', אז אנחנו רוצים או אחד או שתיים,
בדיוק אחד כזה. לאחר מכן פה אנחנו נהיה קצת יותר בררנים פחות בררנים פה ניתן למספרים 0 16 אנחנו רוצים את המספרים בעצם 0 עד 9 ושלוש פעמים זה בעצם רג'קס הכי טוב שאפשר לכתוב לתפוס את הדבר הזה כי כל חריגה הכי קטנה דופקת אותו רגע שנכתוב פה 40 אפילו 30 ו32 זה לא טוב יש לי פה טעות זה, יש פה פשלה קטנה של 32 זה באמת יתפוס,
ואין באמת יום של 32. צריך לחשוב איך לתקן