לדלג לתוכן

8.6 רגקס הרצאה

מה זה רגקס

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

מתי רגקס

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

רגקס

  • נשחק עם רגקס עם מנוע רגקס אינטרנטי הבא: https://regex101.com/
  • הכניסו את הטקסט הבא לאתר:
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
    Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
    Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
    
    1. Phone Numbers:
       - 123-456-7890, (555) 123-4567, 987.654.3210
    
    2. Email Addresses:
       - user@example.com, support@company.org, admin_123@gmail.com
    
    3. Dates:
       - 2022-01-15, 03/20/2023, 10-05-21
    
    4. URLs:
       - https://www.example.com, http://subdomain.example.org/path/page.html, ftp://ftp.example.net
    
    5. Programming Code:
       - for (int i = 0; i < 10; i++) {
             System.out.println("Hello, World!");
         }
    
    6. Special Characters:
       - @#$%^&*(), ~`{}[];':"<>,.?/\|
    
    7. Lorem Ipsum:
       - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin aliquam volutpat felis. Sed ut tristique felis. Integer sit amet ullamcorper quam, vel convallis arcu. Nam euismod nunc vel ante elementum, vel euismod justo volutpat.
    
    8. Random Mix:
       - 123-abc-XYZ, !@#$%^123, Quick brown fox jumps over 987 lazy dogs. It's 3.14, isn't it?
    
    9. HTML Tags:
       - <p>This is a paragraph.</p>
       - <a href="https://www.example.com">Visit Example</a>
       - <img src="image.jpg" alt="Example Image">
    
    10. Mixed Text:
       - Alice123 likes to visit https://bob.example.org and send emails to bob@example.net. 
         However, she often forgets to include the country code in phone numbers, like (123) 456-7890.
    
  • עכשיו ננסה לפלטר על הטקסט עם ביטויי רגקס שנרכיב בעצמנו.
  • מה אם נרצה להוציא את כל המקומות שבהם כתוב את המילה "to"? אז נוכל לעשות את הביטוי רגקס הבא: "to".

אותיות מיוחדות

  • מה אם נרצה לעשות ביטוי רגקס שתופס את כל המספרים? נוכל להשתמש בביטוי d\.
  • \d: מתאים לכל ספרה.
  • \w: מתאים לכל תו של מילה (אותיות, ספרות וקווים תחתונים).
  • \s: מתאים לכל תו של רווח לבן (רווחים, טאבים, מעברי שורה).
  • .: מתאים לכל תו בעולם מלבד תו שורה חדשה.

מכמתים

לפעמים נרצה לכתוב ביטוי רגקס שתופס שתופס תו מסויים מספר פעמים, כדי לבצע זאת נשתמש במכמתים. הנה כמה דוגמאות למכמתים:
- *: אפס או יותר.
- +: אחד או יותר.
- ?: אפס או אחד.
- {n}: n מופעים בדיוק.
- {n,}: n מופעים או יותר.
- {n,m}: בין n ל-m מופעים.
- דוגמה: הביטוי הבא:
\d{3}
יחזיר לנו את כל הפעמים שהפיעו 3 מספרים בדיוק.
123.*visit
יחזיר לנו את כל התווים שנמצאים בין 123 לvisit כולל

קבוצות תווים

  • לפעמים נרצה לכתוב ביטוי רגקס שתופס תווים מסויימים שאנחנו מציינים, נעשה את זה עם כתיבת התווים ב [].
  • [abc]: מתאים לכל אחד מהתווים a, b או c.
  • [a-z]: מתאים לכל אות קטנה.
  • [0-9]: מתאים לכל ספרה.
  • [^abc]: מתאים לכל תו מלבד a, b או c (שלילה).
    דוגמה:
    a [0-9]{4}[-/][0-9]{2}[-/][0-9]{2}
    יחזיר לנו כל מיני סוגים של תאריכים בטקסט

עוגנים

עוגנים קובעים את מיקומו של ההתאמה ביחס להתחלה (^) או סוף ($) של השורה.
- ^abc: מתאים למחרוזת שמתחילה ב-abc.
- abc$: מתאים למחרוזת המסתיימת ב-abc.

דוגמאות לרגקס

  • mail - `[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}
  • phone number - \(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}

מודול re

  • שימוש ברגקס בפייתון:
    import re
    
    pattern = r'\d+'  # A regular expression pattern to match one or more digits
    text = 'The prices are $25.99 and $19.95'
    matches = re.findall(pattern, text)
    
    print(f'Matches: {matches}')
    
  • הפונקציה findall מאפשרת לנו לחפש את כל הפעמים בהם הביטויי רגקס מופיע בקובץ

import re

pattern = r'\d+'  # A regular expression pattern to match one or more digits
text = 'The prices are $25.99 and $19.95'
updated_text = re.sub(pattern, 'XX.XX', text)

print(f'Updated text: {updated_text}')

- הפונקציה sub מאפשרת לנו להחליף את כל הפעמים שביטוי רגקס מופיע בטקסט במחרוזת כלשהי

import re

pattern = r'\d+'  # A regular expression pattern to match one or more digits
text = '25.99 is the price'
match = re.match(pattern, text)

if match:
    print(f'Match found: {match.group()}')
else:
    print('No match')

- הפונקציה match רק בודקת האם יש לפחות פעם אחת שהביטוי רגקס נמצא בטקסט.