הבלוג של ינון פרק

טיפים קצרים וחדשות למתכנתים

הצצה אחורה בביטוי רגולארי בפייתון

02/05/2018

קבלו חידת ביטויים רגולריים פשוטה לפתוח את הבוקר: נתון הטקסט I am :the: walrus ואנחנו רוצים לפצל אותו לשני חלקים כך שהחלק הראשון כולל את כל מה שמופיע עד הנקודותיים השניים (כולל הנקודותיים) והחלק השני כל מה שבא אחרי הרווחים.

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

טוב אז ברור ש split רגיל של מחרוזת לא יעבוד כאן - split יבלע לי את הנקודותיים ואת הרווח שאחריהן:

text = 'I am :the:      walrus'
text.split(': ')
['I am :the', '     walrus']

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

import re
text = 'I am :the:      walrus'
re.split('(: )', text)
 ['I am :the', ': ', '     walrus']

וכן ראיתם נכון - בגלל ששמתי את הנקודותיים והווח בתוך סוגריים פייתון שמר אותם כאיבר נוסף ברשימת התוצאה. בלי הסוגריים התוצאה תהיה זהה ל str#split.

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

import re
text = 'I am :the:      walrus'
re.split('(?<=:) ', text)

# or if you don't need the spaces before the walrus
re.split('(?<=:) +', text)
['I am :the:', 'walrus']

באופן כללי ובפרט בפייתון ארבעת סוגי ההצצות והסימנים שלהן הם:

  1. הצצה קדימה - Positive Lookahead מסומן באמצעות (?=foo). חיפוש המקום בקלט שאחריו מופיעה המילה foo.

  2. הצצה אחורה - Positive Lookbehind מסומן באמצעות (?<=foo). חיפוש המקום בקלט שלפניו מופיעה המילה foo.

  3. הצצה קדימה שלילית -Negative Lookahead מסומן באמצעות (?!foo). חיפוש מקום בקלט שאחריו לא מופיעה המילה foo.

  4. הצצה אחורה שלילית - Negative Lookbehind מסומן באמצעות (?<!foo) חיפוש המקום בקלט שלפניו לא מופיעה המילה foo.

לדוגמאות נוספות על Lookahead ו Lookbehind שווה להעיף מבט בקישור כאן:

href='http://www.rexegg.com/regex-lookaround

** בואו לכתוב איתי קוד: החודש אני מתחיל לקיים מפגשי תרגול בהם אנחנו כותבים יחד קוד ומדברים על הקוד שכתבנו. במפגשים תקבלו אינספור רעיונות חדשים איך לפתור בעיות. קראו עוד בעמוד מפגשי התרגול **

שאלות מראיונות עבודה: טיפוס מדרגות

14/01/2018

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

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

המשך קריאה

חדש באתר: קהילת מתכנתים

31/12/2017

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

המשך קריאה

תרגילים על רקורסיה

17/12/2017

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

המשך קריאה

הצפנת קבצים בפייתון

10/12/2017

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

המשך קריאה

מדריך: פיתוח יישומים גרפיים בפייתון עם Qt

29/10/2017

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

המשך קריאה

קורס חדש: פייתון למתחילים ממש

15/10/2017

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

המשך קריאה

פערי תרבויות בין שפות

01/10/2017

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

המשך קריאה