فصل ۱۱ · ادامهٔ مسیر

عبارت‌های منظم و استخراج اطلاعات

الگوی متن را تعریف کن و عددها، برچسب‌ها یا دامنه‌ها را بیرون بکش.

۴۵ دقیقهٔ پیشنهادی مطالعه و تمرین۵ بخشتمرین عملی و خودآزمایی

بعد از این فصل می‌توانی…

  • از re.search و re.findall استفاده کنی.
  • الگوهای ساده و گروه استخراج بسازی.
  • تطبیق حریصانه را تشخیص بدهی.

پیشنهاد برای پیش‌نیاز: تاپل و مرتب‌سازی داده‌ها

ویدیوی این فصل

عبارت‌های منظم و استخراج اطلاعات

ویدیوی این فصل هنوز اضافه نشده است. می‌توانی همین حالا آموزش متنی و تمرین‌ها را شروع کنی.

بخش 1

جست‌وجو بر اساس الگو

وقتی به جای یک متن ثابت، الگویی مثل «چند رقم پشت سر هم» می‌خواهی، عبارت منظم کمک می‌کند. ابتدا import re بنویس. برای متن ثابت، in یا startswith معمولاً ساده‌تر است.

re.search شیء Match یا None می‌دهد، نه مستقیماً True و False؛ در if می‌توان از درست یا نادرست بودن آن استفاده کرد. re.findall فهرست تطبیق‌ها را برمی‌گرداند.

استخراج عددها

import re
text = "Group 12 has 3 projects and 24 points"
numbers = re.findall(r"[0-9]+", text)
print(numbers)
خروجی مورد انتظار
['12', '3', '24']
بخش 2

نشانه‌های اصلی

^ ابتدای متن و $ انتهای متن را مشخص می‌کند. [0-9] یک رقم و [a-z] یک حرف انگلیسی کوچک است. + یعنی یک یا بیشتر، و * یعنی صفر یا بیشتر از الگوی قبلی.

نقطه معمولاً هر نویسه به جز پایان خط را می‌گیرد. \s برای فاصلهٔ سفید و \S برای غیرِ فاصله است. [^ ] نویسه‌ای به جز فاصلهٔ معمولی می‌گیرد. با پیشوند r، بک‌اسلش‌های الگو را روشن‌تر می‌نویسیم.

خط دارای برچسب

import re
for line in ["Score: 18", "Note: practice", "Score: 20"]:
    if re.search(r"^Score:", line):
        print(line)
خروجی مورد انتظار
Score: 18
Score: 20
بخش 3

حریصانه و کمینه

تکرارهای * و + معمولاً تا جایی که تطبیق کامل ممکن باشد، بخش بیشتری می‌گیرند. افزودن ? مثل +? باعث می‌شود کوتاه‌ترین بخش سازگار با ادامهٔ الگو انتخاب شود.

در نمونه، الگوی اول تا آخرین دو نقطه پیش می‌رود و الگوی دوم در اولین دو نقطه پایان می‌یابد.

دو نوع تطبیق

import re
text = "From: Using the : character"
print(re.findall(r"^F.+:", text))
print(re.findall(r"^F.+?:", text))
خروجی مورد انتظار
['From: Using the :']
['From:']
بخش 4

گروه استخراج و کاراکتر خاص

پرانتز بخش مورد نظر برای استخراج را مشخص می‌کند. در الگوی @([^\s]+)، تطبیق از @ آغاز می‌شود اما فقط بخش داخل پرانتز در خروجی findall می‌آید.

برای نقطهٔ واقعی از \. و برای علامت دلار واقعی از \$ استفاده کن. این الگوهای آموزشی برای متن با ساختار معلوم‌اند و اعتبارسنج کامل همهٔ آدرس‌های ایمیل نیستند.

گرفتن دامنه

import re
text = "From sara@example.org Saturday"
print(re.findall(r"^From \S+@([^\s]+)", text))
خروجی مورد انتظار
['example.org']
بخش 5

تبدیل نتیجه به عدد

خروجی findall رشته است. بعد از بررسی تعداد تطبیق‌ها، آن‌ها را int یا float کن و محاسبه انجام بده. اگر فهرست خالی باشد، پیش از max یا تقسیم تصمیم بگیر چه پیامی بدهی.

الگو را با نمونهٔ درست، متن بدون تطبیق و مرزهای آن آزمایش کن. الگوی [0-9.]+ ممکن است متن‌هایی مثل 1..2 را هم بگیرد؛ برای اعداد ساده با حداکثر یک بخش اعشاری، الگوی دقیق‌تری لازم است.

حالا نوبت توست

جمع امتیازها

از متن «score=12 score=8 score=20» عددهای بعد از score= را استخراج و جمع کن. نتیجه ۴۰ است.

یک راهنمای کوچک

از گروه ([0-9]+) استفاده کن و هر تطبیق را int کن.

پاسخ پیشنهادی و خروجی
import re
text = "score=12 score=8 score=20"
values = re.findall(r"score=([0-9]+)", text)
total = 0
for value in values:
    total += int(value)
print(total)

خروجی نمونه

40

خودآزمایی

پاسخ را انتخاب کن و دلیل آن را بخوان. این بخش برای تمرین است و نمرهٔ رسمی ثبت نمی‌کند.

1. اگر تطبیقی نباشد، re.findall چه می‌دهد؟
2. کدام برای نقطهٔ واقعی در الگوی raw مناسب است؟
عبارت‌های منظم و استخراج اطلاعات | پایتون نوجوانان