שלום אורח התחבר

הפונקציות match, fullmatch ו search של מודול re ב 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.

מעדיפים לקרוא מהטלגרם? בקרו אותנו ב:@tocodeil

או הזינו את כתובת המייל וקבלו את הפוסט היומי בכל בוקר אליכם לתיבה:


נהניתם מהפוסט? מוזמנים לשתף ולהגיב