הפונקציות match, fullmatch ו search של מודול re ב Python
פוסט זה כולל טיפ קצר לעבודה יעילה עם 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
.