רעננו את הדף והקליקו למעבר לנושא הבא:

re-ספריה לחיפוש בטקסט

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

import re pattern=re.compile("\d+") text="Eddie says my pone number is 073-7143670 and i like music from the 80's " \ 'haha@music.com' \ 'duran_duran@music.org' \ 'pink_floyd@music.co.il ' print(pattern.findall(text))


תחילה מייבאים את ספריית re ולאחר מכן יוצאים תבנית באמצעות הפקודה re.compile שבתוך הסוגריים שלה אנו בונים את התבנית שבהמשך נחפש בתוך הטקסט שלנו. הביטוי "+d\" מסמל למשל שאנו מחפשים סדרות של מספרים digit לכן האות d שאחריהן עוד מספר אחד או יותר ולכן הסימן + . תחת המשתנה text הכנסתי כמה משפטים שבהם נחפש תבניות שניצור. לתבנית שלנו קוראים pattern אנו מחפשים בטקסט באמצעות כתיבת המילה pattern ואחריה נקודה וסוג החיפוש שאנו רוצים לבצע. בתוכנית שלמעלה המחשב מחזיר רשימה, כי הפקודה findall מחזירה רשימות של כל המחרוזות העונות על הגדרת התבנית -

output:

['073', '7143670', '80']

אבל מה אם אנו רוצים את כל מספר הטלפון כמו שהוא ובלי דברים אחרים שאינם מספר וטלפון ? אנו צריכים ליצור תבנית חדשה.

התבנית הזאת - (pattern=re.compile("\d\d\d.\d\d\d\d\d\d\d" תיתן לנו כל מחרוזת המורכבת מרצף של שלוש ספרות, שלאחריו סימן כלשהו (הנקודה מסמלת סימן כלשהו) ולאחריו רצף של שבע ספרות. כמובן שאפשר להכין באופן דומה תבנית עבור מספר טלפון סלולרי.

אנו מקבלים -

output:

['073-7143670']


כעת נגיד שאנו מחפשים כתובות דוא"ל בלבד ) את הטקסט נכניס בין מרכאות משולשות (""") יותר אלגנטי-

import re pattern=re.compile("\w+@\w+\.\w+\.?\w+.?") text="""Eddie says my pone number is 073-7143670 and i like music from the 80's haha@music.com duran_duran@music.org pink_floyd@music.co.il """ print(pattern.findall(text))


הסימן w מייצג אותיות מספרים וקו תחתון כך מתחילה כתובת דוא"ל טיפוסית ואנו מצפים למצוא אחד או יותר מהסימנים הללו עד שאנו מגיעים לכרוכית @ לאחר הכרוכית אנו רוצים לראות שוב רצף של אותיות ומספרים וקו תחתון לאחר מכן תמיד נקודה לאחר מכן רצף של אותיות בדרך כלל ולעיתים מסיימים בזה כאשר הסיומת שלנו למשל היא com. אבל לעתים יש המשך למשל כאשר הסיומת היא co.il כאן נכנסים סימני השאלה להביע שהאלמנט בתבנית הוא אופציונלי ולמצוא גם מחרוזות עם אותו אלמנט וגם בלעדיו.

כשכתבתי את התבנית ראיתי שהיא מדפיסה את הסיומת co.i ולא co.il למרות שביקשתי רצף שלאחריו הסימן + שמשמעותו אחד או יותר משום שלא הגדרתי עד לאן הרצף הזה צריך להמשך - ורק כאשר הוספתי נקודה(.) לאחר ה + התוכנית השלימה את כל החיפוש והציגה את הדוא"ל המלא משום שנקודה עם סלש הפוך לפניה, מסמלת בעצם כל סימן אות או מספר לרבות שורה ריקה שמגיעים לאחר הרצ שהגדרנו -


['haha@music.com', 'duran_duran@music.org', 'pink_floyd@music.co.il']


ישנה אפשרות להכניס מספר אופציות לסוגריים מרובעים למשל [!,?] פירושים סימן קריאה או פסיק או סימן שאלה ורק אחד מהם. זה למשל ("pattern=re.compile(r"\d0[w'?,.]sימצא לנו את המחרוזת

output:

["80's"]

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

הסיפור של האות r בתוך הסוגריים לפני התבנית, פירושה שאנו מחפשים מחרוזת בתצורתה הגולמית כלומר שסלשים הפוכים במחרוזת אינם מסמנים משהו מיוחד כמו ירידת שורה או טאב כנהוג בפייתון אלא סתם סלש הפוך המשמש את הספרייה re לעניינים אחרים, זה נחוץ משום שהספרייה re עושה כפי שראינו לעיל שימוש בסלשים הפוכים כדי להגדיר תבניות (ולא כפי שפייתון מכירה את הסלשים ההפוכים האלה).

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


יש אפשרות למצוא רק רצפים הפותחים את המחרוזת -

import re pattern=re.compile(r"[eE]\w+") text="""Edd says: my name is Eddie Arbili""" print(pattern.findall(text))

>>>

['Edd', 'Eddie']

כדי שהתוכנית תמצא רק את Edd אנו נוסיף לתבנית את הסימן ^ שפירושו רק רצף הפותח מחרוזת -


pattern=re.compile(r"^[eE]\w+")

...

>>>

['Edd']

הסימן לרצף המסיים מחרוזת הוא $ בסוף התבנית -

import re pattern=re.compile(r"A\w+$") text="""Edd says Am I dreaming?: my name is Eddie Arbili""" print(pattern.search(text))

>>>

<_sre.SRE_Match object; span=(42, 48), match='Arbili'>


אנו רואים למעלה שהתוכנית לא תפסה את המילה Am שגם היא מתילה ב- A אלא רק את המילה שמסיימת את המחרוזת. בדוגמא למעלה גם הפעלנו את המתודה search שנותנת לנו כל מיני נתונים בין היתר את המקום שבו מתחילה המילה שחיפשנו Arbili במיקום ה- 42 במחרוזת, והמיקום בו המילה מסתיימת 48 כך שאם היינו רוצים לבצע חיתוך של המחרוזת (הטקסט):

import re pattern=re.compile(r"A\w+$") text="""Edd says Am I dreaming?: my name is Eddie Arbili""" print(text[42:48])

>>>

Arbili

הספריה היא עצומה ויש בה אפשרויות רבות - נעבור בקצרה על חלק מהסימנים ומשמעותם -

\b מחרוזת ריקה לפני ואחרי מילה

\B מחרוזות ריקות שאינן לפני ואחרי מילה

\d ספרה 0-9

\D כל מה שאינו ספרה 0-9

\s מרווחים למיניהם כולל טאב ושורה חדשה

\S כל מה שאינו רווח כאמור לעיל

\w אותיות באנגלית גדולות וקטנות וכן ספרות 0-9 וכן קו תחתון

\W כל מה שאינו אות ספרה או קו תחתון כאמור לעיל

\Z סוף המחרוזת

{n} פעמים n חזרת כל התבנית על עצמה

* אפס או יותר חזרות על אלמנט

+חזרה אחת או יותר על אלמנט

? אפס או אחת חזרות על אלמנט


דוגמא לחיפוש של מילים המתחילות ב- E או ב- A באמצעות השימוש בסימן | (בצד ימין של המקלדת מעל הסלש ההפוך) :

import re pattern=re.compile(r"E\w+|A\w*") text="""Edd says Am I dreaming?: my name is Eddie Arbili""" print(pattern.findall(text))

>>>

['Edd', 'Am', 'Eddie', 'Arbili']

אלה הדברים העיקריים, למרות שיש עוד הרבה בספרייה העצומה והשימושית הזאת re


Related Posts

See All

תוכן הקורס

תוכן עניינים מבוא הורדה והתקנת התוכנה על גבי המחשב שלכם חלק ראשון - יסודות פקודת print מחרוזות - גרשיים (") או גרש (') פעולות מתמטיות בסיסיות סוגי מספרים - integer או float משתנים תנאים – פקודת if ומ

memoization in python

בעברית קוראים לזה תזכור (tizkur) ובהתחלה זה נראה כמו שגיאת כתיב של המילה memorization אבל זה זה לא. ומדובר במושג בעל חשיבות גדולה מאוד, בעיקר לתוכנה כמו פייתון שעקב האכילס שלה הוא מהירות הריצה של התוכ