משתמש:Mad dr/פייתון/מודולים/re: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
Mad dr (שיחה | תרומות)
יצירת דף עם התוכן " נושא עיבוד המידע חשוב מאוד בתכנות, ולעיתים אנו נדרשים לעבד טקסט חופשי שלא מסודר בפורמט כ..."
 
Mad dr (שיחה | תרומות)
אין תקציר עריכה
שורה 103:
'path': '3/library/re.html',
'protocol': 'https'}</source>
 
וכמו שאתם רואים, יש באג עם אוגרים ריקים... אם למישהו יש הסבר הוא מוזמן לשתף בתגובות.
==compile==
תיעוד - [https://docs.python.org/3/library/re.html]
המתודה compile מאפשרת לנו "לשמור" ביטוי רגולרי מסויים ולהשתמש בו עבור מספר מחרוזות, לדוגמא:
<source lang="python">>>> email_pattern = re.compile(r'\w+@\w+[.].+')
>>> p.match(r'a@a.a')
<_sre.SRE_Match object; span=(0, 5), match='a@a.a'>
>>> p.match(r'a@a')
>>> p.match(r'a@a.')
>>> p.match(r'user@host.domain')
<_sre.SRE_Match object; span=(0, 16), match='user@host.domain'></source>
המשתנה email_pattern מחזיק בתוכו Regular Expression Object שמאפשר אחר-כך להשתמש כמעט בכל הפונקציות האחרות של re ללא צורך לחזור על התבנית (הפרמטר הראשון יהיה כבר המחרוזת הנבדקת).
 
==split==
split מאפשרת לנו לחלק מחרוזת לרשימה, כאשר ההפרדה היא לפי ביטוי רגולרי, אחרי הרגקס והמחרוזת, ניתן להוסיף פרמטר שאומר כמה חלוקות לבצע, כאשר 0 יחלק את המחרוזת עד הסוף ומספר אחר יעצור את מספר החלוקות בהתאם.
 
בנוסף, אם הרגקס יהיה מוקף בסוגריים (בדומה להשארת אוגרים) גם ההפרדה תשמר כערך ברשימה. הדוגמא הבאה מראה את כל האפשרויות.
<source lang="python">>>> re.split('\W+', 'Words, words, words.')
['Words', 'words', 'words', '']
>>> re.split('(\W+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split('\W+', 'Words, words, words.', 1)
['Words', 'words, words.']
>>> re.split('(\W+)', '...words, words...')
['', '...', 'words', ', ', 'words', '...', '']</source>
 
שימו לב, אם ההפרדה נמצאת בהתחלה או בסוף המחרוזת תהיה מחרוזת ריקה ברשימה (בהתאם למיקום ההפרדה)
 
==sub==
sub מאפשרת לנו להחליף חלקים במחרוזת, זהו אחד המקומות בו שמירה על הערכים (מה שקראנו לו "אוגרים") יהעיל ביותר (למי שהתנסה בsed או awk הדברים ברורים)
 
השימוש באוגרים יכול להתבצע עם סלאש-הפוך (\) ואחריו המספר הסידורים של האוגר, או האות g ושם האוגר (או המספר שלו) בתוך סוגריים משולשים (תראו בשורה האחרונה בדוגמא).
 
sub מקבלת פרמטר נוסף המורה כמה החלפות יש לבצע, בדומה ל-split, המספר 0 אומר לבצע החלפה לכל מופע, ואילו מספר אחר יעצור את ההחלפות בהתאם.
<source lang="python">>>> re.sub(r'\sAND\s', ' & ', 'Baked Beans And Rice', flags=re.IGNORECASE)
'Baked Beans & Rice'
>>> re.sub(r'(.*)\sAND\s(.*)', r'\2 & \1', 'Baked Beans And Rice', flags=re.IGNORECASE)
'Rice & Baked Beans'
>>> re.sub(r'(?P<first>.*)\sAND\s(?P<second>.*)', r'\g<2> & \g<first>', 'Baked Beans And Rice', flags=re.IGNORECASE)
'Rice & Baked Beans'</source>
==findall & finditer==
findall מחזירה את כל הערכים שמתאימים לתבנית כרשימה, ואילו finditer מחזירה אותם כאיטרטור של MatchObject (ככה שצריך לעבור עליהם בלולאה)
<source lang="python">>>> re.findall('\D+', 'asd3fghjk')
['asd', 'fghjk']
>>> for i in re.finditer(r'(?P<name>\w+\s\w+)[,\s]*(?P<address>.*)', 'Israel Israeli, Tel Aviv\nMoishe Oofnik, Sesame Street'):
... print(i.groupdict())
...
{'address': 'Tel Aviv', 'name': 'Israel Israeli'}
{'address': 'Sesame Street', 'name': 'Moishe Oofnik'}</source>
 
==escape==
המתודה escape היא המתודה היחידה שלא קיימת באובייקט שמוחזרת מ-compile. היא לא מקבלת רגקס לעבוד איתו, אלא פשוט מחזירה מחרוזת עם סלאש הפוך לפני כל תו מיוחד (כלומר כל תו שהוא לא אלפא-נומרי או קו תחתון)
<source lang="python">>>> re.escape("{'address': 'Sesame Street', 'name': 'Moishe Oofnik'}")
"\\{\\'address\\'\\:\\ \\'Sesame\\ Street\\'\\,\\ \\'name\\'\\:\\ \\'Moishe\\ Oofnik\\'\\}"</source>
 
תיעוד - [https://docs.python.org/3/library/re.html]