תיעוד עבור מודול Re עבור Python 3 ב. מודול מחדש לביטויים רגולריים

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

היום נדבר בפירוט על מה זה בכלל, איך לעבוד איתם ואיך המודול re יעזור.

ביטויים רגולריים: הקדמה

מהם השימושים בביטויים רגולריים? כמעט כל. לדוגמה, אלה:

  1. יישומי אינטרנט הדורשים אימות טקסט. דוגמה טיפוסית היא לקוחות דואר מקוונים.
  2. כל פרויקט אחר הקשור לטקסטים, מאגרי מידע וכן הלאה.

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

מהי תבנית בספריית Re?

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

לדוגמה, קח את התבנית הבאה: s+. זה אומר כל תו רווח. אם תוסיף לו סימן פלוס, זה אומר שהתבנית כוללת יותר מרווח אחד. זה אפילו יכול להתאים לתווי טאב שנקראים איתם t+.

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

>>> ייבוא ​​מחדש

>>> regex = re.compile('s+')

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

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

נניח שיש לנו משתנה המכיל את המידע הבא.

>>> טקסט = """100 INF אינפורמטיקה

213 מתמטיקה מתמטיקה  

156 ENG אנגלית»»»

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

  1. לקרוא פונקציה פיצול מחדש.
  2. להחיל פונקציה לפצל ל regex.

הנה דוגמה לשימוש בתחביר של כל אחת מהשיטות עבור המשתנה שלנו.

>>> re.split('s+', text)  

# או

>>> regex.split(text)

פלט: ['100', 'INF', 'מדעי המחשב', '213', 'MAT', 'Math', '156', 'ENG', 'English']

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

מציאת התאמות עם שלוש פונקציות

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

re.findall()

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

>>> הדפס (טקסט)  

100 INF אינפורמטיקה

213 מתמטיקה מתמטיקה  

156 ENG אנגלית

>>> regex_num = re.compile('d+')  

>>> regex_num.findall(טקסט)  

['100', '213', '156']

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

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

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

re.search() לעומת re.match()

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

בתורו, הפונקציה re.match עושה את אותו הדבר. רק התחביר שונה. יש למקם את התבנית בהתחלה. 

ניקח דוגמה שממחישה זאת.

>>> # צור משתנה עם טקסט

>>> text2 = «»»INF Informatics

213 MAT Mathematics 156 אינץ' »»  

>>> # קומפלו רגקס וחפשו תבניות

>>> regex_num = re.compile('d+')  

>>> s = regex_num.search(text2)  

>>> print('First index: ', s.start())  

>>> print('Last index: ', s.end())  

>>> print(text2[s.start():s.end()]) 

מדד ראשון: 17 

מדד אחרון: 20

213

אם אתה רוצה לקבל תוצאה דומה בדרך אחרת, אתה יכול להשתמש בפונקציה קְבוּצָה().

החלפת חלק מהטקסט בספריית Re

כדי להחליף טקסט, השתמש בפונקציה re.sub(). נניח שרשימת הקורסים שלנו השתנתה מעט. אנחנו רואים שאחרי כל ערך דיגיטלי יש לנו לשונית. המשימה שלנו היא לשלב את כל הרצף הזה לשורה אחת. לשם כך, עלינו להחליף את הביטוי s+ לעבור 

הטקסט המקורי היה:

# צור משתנה עם טקסט

>>> טקסט = """100 INF t אינפורמטיקה

213 MAT ט מתמטיקה  

156 ENG לא אנגלית»»»  

>>> הדפס (טקסט)  

100 מידע מדעי המחשב

213 מט מתמטיקה  

156 ENG אנגלית

כדי לבצע את הפעולה הרצויה, השתמשנו בשורות הקוד הבאות.

# החלף רווח אחד או יותר ב-1

>>> regex = re.compile('s+')  

>>> print(regex.sub(' ', text))  

כתוצאה מכך, יש לנו שורה אחת. 

101 COM מחשבים 205 MAT Mathematics 189 ENG אנגלית

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

סִפְרִיָה Re תומך בתכונה כגון התאמה שלילית. היא שונה מהישירה בכך שהיא מכילה סימן קריאה לפני הלוכסן. כלומר, אם אנחנו צריכים לדלג על התו החדש, אז אנחנו צריכים לכתוב !n במקום n.

נקבל את הקוד הבא.

# הסר את כל הרווחים מלבד שורה חדשה  

>>> regex = re.compile('((?!n)s+)')  

>>> print(regex.sub(' ', text))  

100 INF אינפורמטיקה

213 מתמטיקה מתמטיקה  

156 ENG אנגלית

מהן קבוצות ביטוי רגולרי?

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

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

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

יהיה מספר קטן מאוד של קווים. 

# צור קבוצות של תבניות טקסט של קורס וחלץ אותן

>>> course_pattern = '([0-9]+)s*([A-ZY]{3})s*([a-zA-ZoY]{4,})'  

>>> re.findall(course_pattern, text)  

[('100', 'INF', 'מדעי המחשב'), ('213', 'MAT', 'Math'), ('156', 'ENG', 'English')]

המושג התאמה "חמדנית".

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

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

>>> טקסט = "דוגמה להתאמת ביטויים רגולריים חמדנים"  

>>> re.findall('', text)  

['דוגמה להתאמת ביטויים רגולריים חמדנים']

במקום לחלץ רק תג אחד, פייתון קיבל את כל המחרוזת. לכן זה נקרא חמדן.

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

תקבל את הקוד הבא ואת הפלט של המתורגמן.

>>> re.findall('', text)  

[", "]

אם נדרש לקבל רק את ההתרחשות הראשונה שנתקלה בה, נעשה שימוש בשיטה לחפש ().

re.search('', text).group()  

"

אז רק תג הפתיחה יימצא.

תבניות ביטוי פופולריות

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

תיעוד עבור מודול Re עבור Python 3 ב. מודול מחדש לביטויים רגולריים

סיכום

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

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

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

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

השאירו תגובה