פורסם ב כלים לחיים קלים

סיפור אימה לפני השינה למתכנתות: Regex

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

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

היום שמעתי שכנס devops days השנה הולך להיות בסימן Horror Stories. כששמעתי את זה ישר חשבתי על כמה שזה נושא מגניב, וזה אשכרה נתן לי השראה לכתוב סיפור אימה על Regex.
אז תודה אישית למארגני הכנס על ההשראה. (ותגישו הרצאות ל-devops days, אפשר עד מחר!)

היה הייתה פעם…

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

בינתיים היא הלכה לאוניברסיטה, 
ובמקביל הלכה לעבוד בחברה גדולה, 

המשרה שלה הייתה מאוד משונה,
כל היום היא רק ישבה וכתבה,
(לא תאמינו כשתשמעו איזו זוועה),
מחרוזות תווים שמחפשות התאמה.

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

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

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

יום אחד הנערה פגשה מפלצת מפחידה

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

ברגע שנתקלתי לראשונה ב-regex-ים, כל אמוני בתחום התכנות התערער. פתאום לא היה מספיק לזכור כמה מילות syntax, הייתי צריכה לזכור מבנים, חוקים וסדר שרירותי של תווים. אם הייתי כותבת ^ לפני ) הכל היה עובד כמו שצריך, אבל אם הייתי כותבת בטעות ) לפני ^ הכל היה נכשל, ולא הייתה לי שום דרך לדעת למה.

הדבר הכי גרוע ב-Regex-ים, זה שבניגוד לכל פיסת קוד אחרת שאפשר למצוא ב-Stack Overflow ולהמיר לצרכייך, ברגע שניסית להעתיק ביטוי Regex מ-SO לקוד שלך, יכולת להיות בטוחה שהוא לא הולך לעבוד.

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

אחרי הרבה שנים הגיעה לכפר מכשפה רבת עוצמה

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

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

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

המכשפה הכינה שיקוי נגד מפלצות

נתחיל משני הכללים הכי חשובים שצריך לזכור כשעובדות עם -ChatGPT.

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

בואו נגיד, בשביל ההדגמה, שאני רוצה לכתוב Regex שמקבל את העמוד הראשי של אתר החדשות הרציני dailypuppy ומביא לי משם את השמות של כל הכלבלבים.

(נא לא לתקוף אותי, ברור לי שאפשר לעשות את זה בלי Regex, זו הדגמה).

אז אני מסתכלת ורואה שהשמות של הכלבלבים תמיד מגיעים אחרי המילה Meet, ובחינה של ה-HTML מראה לי שהם מופיעים בתוך כותרת H1. אני אקח את המידע הזה ל-ChatGPT, ואבקש ממנו Regex שמחלץ את השמות מתוך ה-HTML.

זה הביטוי ש-ChatGPT הציע –

pattern = r"<h1>(.*?)</h1>"

בואו ננסה!

with open("Regex/dailypuppy.html", "r") as f:
   text = f.read()
puppy_regex = re.compile(r'<h1>(.*?)</h1>')
print(re.findall(puppy_regex, text)) ->

[' Meet Cooper the Lab Mix', ' Meet Dozer', ' Meet Thatcher', ' Meet Zora', ' Meet Echo', ' Meet Arthur']

with open(“Regex/dailypuppy.html”, “r”) as f:

יאי, זה עבד! כמעט סיימנו, עכשיו אני רק צריכה להיפטר מהמילה ״Meet״ בתחילת המשפט.

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

puppy_regex_2 = re.compile(r'<h1> Meet\s(.*?)</h1>')
print(re.findall(puppy_regex_2, text)) ->

['Cooper the Lab Mix', 'Dozer', 'Thatcher', 'Zora', 'Echo', 'Arthur']

בעזרת השיקוי של המכשפה הנערה הצליחה להציל את הכפר!

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

הסוף


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

4 תגובות בנושא “סיפור אימה לפני השינה למתכנתות: Regex

    1. שזה אתר מצוין. אני אוהב גם את regexr.com , ולמי שעובד על לינוקס, אני ממליץ על com.github.artemanufrij.regextester – כלי פחות מרשים, אבל הרבה יותר זריז.

  1. רגקסים הם חברים (רק בד״כ לא על html)! יש לנו כמה ממש מסובכים… אם את רוצה להסתבך עוד יש פקג׳ שנקרא regex שמוסיף עוד פיצ׳רים, כולל fuzzy matching.

השאר תגובה