הפונקציות match, fullmatch ו search של מודול re ב Python

14/01/2021

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

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

1. הפונקציה search

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

דוגמה לשימוש:

import re

if re.search(r'([a-z])\1', 'hello'):
    print("yay")

2. הפונקציה fullmatch

פונקציית fullmatch היא חידוש של פייתון 3.4. השם שלה יחסית לא מבלבל והיא בעצם מחפשת התאמה מלאה בין הטקסט לביטוי הרגולארי. אפשר לדמיין שהיא מוסיפה לביטוי הרגולארי שלנו את התווים \A ו \z להתחלה ולסוף של הביטוי.

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

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

import re

if re.search(r'([a-z])\1', 'hello'):
    print("yay")

if re.fullmatch(r'([a-z])\1', 'hello'):
    print("no...")

הקוד הבא ידפיס yay כי הביטוי הרגולארי מכסה את כל הטקסט:

import re

if re.fullmatch(r'h.*o', 'hello'):
    print("yay")

3. הפונקציה match

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

הנה כמה דוגמאות להמחשה - התוכנית מדפיסה רק את הודעות ה yay ולא את ה no:

import re

if re.match(r'h.*o', 'hello'):
    print('yay')

if re.match(r'h', 'hello'):
    print('yay')

if re.match(r'o$', 'hello'):
    print('no')

שורה תחתונה: נשתמש ב re.search בכל הזדמנות, נשתמש ב re.fullmatch בשביל לספר למי שקורא את הקוד שיש פה חשיבות להתאמה מלאה, ונתרחק מ re.match כי רוב הסיכויים שמי שקורא את הקוד לא יזכור את ההבדל הדק בינה לבין fullmatch.