לדלג לתוכן

מדריך לביטויים רגולריים - regex בפייתון

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

אז מה זה בעצם regex

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

בפייתון עובדים עם regex דרך המודול re:

import re

text = "המספר שלי הוא 052-1234567"
match = re.search(r"\d{2,3}-\d{7}", text)
if match:
    print(match.group())  # 052-1234567

שימו לב ל-r לפני המחרוזת - זה הופך אותה ל-raw string, כדי שהתו \ לא יתפרש בצורה מיוחדת על ידי פייתון עצמה לפני שהוא מגיע ל-regex.

הסימנים הבסיסיים שכדאי להכיר

  • \d - כל ספרה
  • \w - כל תו של מילה, אות ספרה או קו תחתון
  • \s - כל רווח, כולל טאב וירידת שורה
  • . - כל תו למעט ירידת שורה
  • + - תו אחד או יותר מהסוג שלפניו
  • * - אפס או יותר מהסוג שלפניו
  • {2,3} - בין 2 ל-3 חזרות בדיוק
  • ^ ו-$ - תחילת וסוף המחרוזת

עם חמישה או שישה סימנים כאלה אתם כבר יכולים לכתוב רוב ה-regex-ים השימושיים ביומיום.

דוגמאות מעשיות

בדיקה אם מחרוזת היא אימייל תקין בצורה בסיסית:

import re

email = "amit@example.com"
if re.match(r"^[\w.]+@[\w]+\.[a-z]+$", email):
    print("נראה כמו אימייל תקין")

מציאת כל המספרים בטקסט:

text = "יש לי 3 חתולים ו-2 כלבים"
numbers = re.findall(r"\d+", text)
print(numbers)  # ['3', '2']

החלפת כל הרווחים המרובים ברווח אחד:

messy = "יש    כאן   הרבה     רווחים"
clean = re.sub(r"\s+", " ", messy)
print(clean)  # "יש כאן הרבה רווחים"

findall מחזיר רשימה של כל ההתאמות, ו-sub מחליף כל התאמה במשהו אחר. אלה שני הפונקציות שתשתמשו בהן הכי הרבה.

מתי regex זה בדיוק הכלי הנכון

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

מתי דווקא כדאי לוותר עליו

וכאן חשוב להיות כנים, כי הרבה מדריכי regex לא אומרים את זה. אם אתם רק צריכים לבדוק אם מחרוזת מכילה טקסט מסוים, "error" in log_line פשוט וברור הרבה יותר מלכתוב regex. אם אתם רק צריכים לפצל טקסט לפי פסיק, text.split(",") עושה בדיוק את זה בלי צורך ב-regex בכלל.

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

הטעות הנפוצה - regex שאף אחד לא מבין, כולל הכותב

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

לסיכום

regex הוא כלי חזק מאוד למציאת דפוסים בטקסט, אבל כמו כל כלי חזק, קל להגזים בשימוש בו. תלמדו את היסודות, תשתמשו בו כשהבעיה באמת דורשת חיפוש דפוסים, ותזכרו שלפעמים if "x" in text עדיף על regex מפואר.

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

תרגלו regex ועיבוד טקסט בקורס תכנות בסיסי

יש לכם regex שפשוט לא מתפקד כמו שציפיתם? תביאו אותו לקהילה, יש שם אנשים שאוהבים לפצח בדיוק את זה.

הצטרפו לקהילה בדיסקורד