Pandas & NumPy Academy · درس

مطابقة الأنماط باستخدام Regex

استخرج السلاسل الفرعية وتحقق من الأنماط باستخدام .str.extract() و.str.contains() و.str.match() مع التعبيرات النمطية.

الدرس 3 من 413 خطوة

مطابقة الأنماط باستخدام Regex درس مجاني في Pandas & NumPy Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Pandas & NumPy Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.

لماذا نستخدم Regex في Pandas؟

التعبيرات النمطية (regex) هي لغة لوصف أنماط السلاسل النصية. في Pandas، يوفّر .str accessor دعم regex من خلال contains() وmatch() وextract() وfindall() وreplace(). ويكون regex هو الأداة المناسبة عندما تكون أنماطكم معقدة أكثر من أن تعالجها عمليات contains/startswith البسيطة — مثل التحقق من تنسيقات البريد الإلكتروني، أو استخراج أرقام الهواتف من نص حر، أو العثور على جميع القيم بالدولار في عمود للملاحظات.

import pandas as pd

df = pd.DataFrame({
    'text': ['Order #12345 placed', 'No order', 'Ref #67890 paid', 'Refund for #11111']
})

# Find rows that contain an order number (# followed by 5 digits)
has_order = df['text'].str.contains(r'#\d{5}', regex=True)
print(df[has_order])
#                  text
# 0  Order #12345 placed
# 2    Ref #67890 paid
# 3  Refund for #11111

.str.contains() باستخدام Regex

يعيد .str.contains(pattern) مع regex=True (وهو الإعداد الافتراضي) Series منطقية تكون قيمتها True حيثما يطابق النمط أي موضع داخل السلسلة. استخدموا علامات مثل ^ (البداية) و$ (النهاية) لتقييد موضع المطابقة. ومن الاستخدامات الشائعة تصفية الصفوف التي يطابق فيها الحقل متطلبات تنسيق معينة، مثل نمط تاريخ صالح أو رمز منسّق بطريقة صحيحة.

import pandas as pd

df = pd.DataFrame({
    'code': ['US-001', 'UK-042', 'DE-18', 'FR-', 'us-003']
})

# Valid format: two uppercase letters, hyphen, 3 digits
valid = df['code'].str.contains(r'^[A-Z]{2}-\d{3}$', regex=True)
print(df['code'][valid].tolist())
# ['US-001', 'UK-042']

.str.match() للمطابقة المقيّدة بالبداية

يتحقق .str.match(pattern) مما إذا كانت كل سلسلة تبدأ بالنمط (أي إن المطابقة مقيّدة ببداية السلسلة). وهذا هو الفرق عن contains() الذي يبحث في أي موضع داخل السلسلة. استخدموا match() عندما تهتمون ببادئة السلسلة فقط، وfullmatch() عندما يجب أن تطابق السلسلة بأكملها النمط.

import pandas as pd

df = pd.DataFrame({'id': ['ORD001', 'ORD002', 'RET003', 'ORDXYZ']})

# Match rows whose ID starts with 'ORD' followed by digits
orders = df['id'].str.match(r'ORD\d+')
print(df[orders])
#        id
# 0  ORD001
# 1  ORD002

# match() is anchored at start, so 'ORDXYZ' (XYZ not digits) is excluded

.str.extract() لمجموعات الالتقاط

يستخدم .str.extract(pattern) مجموعات الالتقاط () في نمط regex لاستخراج أجزاء محددة من السلاسل المطابقة. ويعيد DataFrame يحتوي على عمود لكل مجموعة التقاط. ولا يُعاد سوى أول تطابق في كل سلسلة. وهذا مناسب تمامًا لاستخراج البيانات المنظمة المضمّنة في نص حر — مثل القيم الرقمية أو التواريخ أو المعرّفات.

import pandas as pd

df = pd.DataFrame({
    'notes': ['Shipped on 2024-01-15', 'Delivered on 2024-03-20', 'Pending', 'Shipped on 2024-07-04']
})

# Extract the date (YYYY-MM-DD) from the notes column
dates = df['notes'].str.extract(r'(\d{4}-\d{2}-\d{2})')
df['shipped_date'] = dates[0]
print(df[['notes', 'shipped_date']])
#                     notes shipped_date
# 0   Shipped on 2024-01-15   2024-01-15
# 1  Delivered on 2024-03-20   2024-03-20
# 2                  Pending          NaN
# 3   Shipped on 2024-07-04   2024-07-04

مجموعات الالتقاط المُسمّاة

يمكنكم تسمية مجموعات الالتقاط باستخدام الصيغة (?P<name>...). وعند استخدام المجموعات المُسمّاة مع str.extract()، يستخدم DataFrame الناتج هذه الأسماء تلقائيًا كرؤوس للأعمدة، ما يجعل المخرجات موضّحة ذاتيًا من دون الحاجة إلى إعادة تسمية الأعمدة لاحقًا.

import pandas as pd

df = pd.DataFrame({
    'entry': ['Alice (25, Engineer)', 'Bob (30, Manager)', 'Carol (28, Analyst)']
})

# Named capturing groups
extracted = df['entry'].str.extract(
    r'(?P<name>\w+) \((?P<age>\d+), (?P<role>\w+)\)'
)
print(extracted)
#     name age      role
# 0  Alice  25  Engineer
# 1    Bob  30   Manager
# 2  Carol  28   Analyst

.str.extractall() للتطابقات المتعددة

يبحث .str.extractall(pattern) عن جميع تطابقات النمط في كل سلسلة، وليس التطابق الأول فقط. ويعيد DataFrame بفهرس متعدد MultiIndex: يمثّل المستوى الخارجي فهرس الصف الأصلي، بينما يحصي المستوى الداخلي (match) التطابقات لكل صف. ويفيد ذلك في استخراج جميع الأرقام أو عناوين URL أو الكلمات المفتاحية من الحقول النصية الحرة.

import pandas as pd

df = pd.DataFrame({
    'text': ['Call 555-1234 or 555-5678', 'Contact 800-9000', 'No numbers']
})

# Extract all phone patterns
all_phones = df['text'].str.extractall(r'(\d{3}-\d{4})')
print(all_phones)
#              0
#   match
# 0 0      555-1234
#   1      555-5678
# 1 0      800-9000

.str.findall() للحصول على قائمة بالتطابقات

يعيد .str.findall(pattern) Series من القوائم، بحيث تحتوي كل قائمة على جميع التطابقات الموجودة في سلسلة ذلك الصف. وعلى خلاف extractall()، لا ينشئ MultiIndex، بل يحصل كل صف على قائمة بالتطابقات. وهذا ملائم عندما تريدون إبقاء النتائج في بنية مسطحة أو عدّ التطابقات لكل صف.

import pandas as pd

df = pd.DataFrame({
    'text': ['Buy 3 items for $10 each', 'Save $5 on 2 products', 'No deal']
})

# Find all dollar amounts
df['prices'] = df['text'].str.findall(r'\$\d+')
df['price_count'] = df['prices'].str.len()

print(df[['text', 'prices', 'price_count']])
#                         text  prices  price_count
# 0  Buy 3 items for $10 each   [$10]            1
# 1  Save $5 on 2 products      [$5]            1
# 2                   No deal      []            0

مطابقة غير حساسة لحالة الأحرف باستخدام re.IGNORECASE

تكون regex في Pandas حساسة لحالة الأحرف بصورة افتراضية. مرّروا flags=re.IGNORECASE (أو re.I) لجعل النمط غير حساس لحالة الأحرف. وبذلك تتجنبون كتابة أنماط بدائل مثل [Pp][Yy][Tt][Hh][Oo][Nn] عند الرغبة في مطابقة 'python' أو 'Python' أو 'PYTHON' بالطريقة نفسها.

import pandas as pd
import re

df = pd.DataFrame({
    'skill': ['Python', 'JAVA', 'javascript', 'PyThOn developer', 'SQL']
})

# Case-insensitive search for python
mask = df['skill'].str.contains('python', flags=re.IGNORECASE, regex=True)
print(df[mask])
#               skill
# 0            Python
# 3  PyThOn developer

التحقق من التنسيقات باستخدام المطابقة الكاملة

يعيد .str.fullmatch(pattern) (المضاف في Pandas 1.1) القيمة True فقط عندما تطابق السلسلة بأكملها النمط. وعلى خلاف contains() الذي يطابق جزءًا من السلسلة، يعادل fullmatch تقييد النمط بالرمزين ^...$. وهذه أكثر الطرق أمانًا للتحقق من الالتزام بتنسيق معين — مثل عناوين البريد الإلكتروني وأرقام الهواتف والرموز البريدية أو أي حقل ذي مخطط صارم.

import pandas as pd

df = pd.DataFrame({
    'email': ['alice@example.com', 'bob_at_work', 'carol@test', 'dave@org.co']
})

# Simple email validation: word@word.word
valid_email = df['email'].str.fullmatch(r'[\w.+-]+@[\w-]+\.[\w.]+')
print(df[valid_email])
#                email
# 0  alice@example.com
# 3        dave@org.co

الاستبدال باستخدام المراجع الخلفية في Regex

عند استخدام str.replace(pattern, repl, regex=True)، يمكن أن تتضمن سلسلة الاستبدال مراجع خلفية مثل r'\1' للإشارة إلى المحتوى الملتقط في المجموعة الأولى (). ويتيح ذلك إعادة تنسيق قوية — مثل تحويل MM/DD/YYYY إلى YYYY-MM-DD أو إحاطة كلمة مطابقة بوسوم HTML.

import pandas as pd

df = pd.DataFrame({'phone': ['(555) 123-4567', '(800) 555-0199', '(212) 867-5309']})

# Reformat to 555-123-4567
df['phone_clean'] = df['phone'].str.replace(
    r'\((\d{3})\) (\d{3})-(\d{4})',
    r'\1-\2-\3',
    regex=True
)
print(df)
#             phone phone_clean
# 0  (555) 123-4567  555-123-4567
# 1  (800) 555-0199  800-555-0199
# 2  (212) 867-5309  212-867-5309

بناء مستخرج بيانات قائم على Regex

فيما يلي مثال عملي شامل من البداية إلى النهاية: استخراج SKU المنتج وسعره من عمود ملاحظات غير منظم باستخدام مجموعات مُسمّاة. ويشيع هذا النوع من الاستخراج عند استيراد البيانات من أنظمة قديمة، حيث جرى دمج عدة حقول في حقل نصي واحد.

import pandas as pd

df = pd.DataFrame({
    'note': [
        'SKU:A001 price:$49.99 in stock',
        'SKU:B202 price:$12.50 low stock',
        'No SKU available'
    ]
})

extracted = df['note'].str.extract(
    r'SKU:(?P<sku>\w+).*price:\$(?P<price>[\d.]+)'
)
print(extracted)
#     sku  price
# 0  A001  49.99
# 1  B202  12.50
# 2   NaN    NaN

تحقق سريع

اختبروا مدى فهمكم لمطابقة الأنماط باستخدام regex في Pandas.

مراجعة الدرس

تعلمتم في هذا الدرس أن str.contains(regex) يصفّي الصفوف حسب النمط، وأن str.extract() يلتقط أول تطابق في عمود من DataFrame (استخدموا المجموعات المُسمّاة للحصول على مخرجات موضّحة ذاتيًا)، وأن str.extractall() يعثر على جميع التطابقات لكل صف باستخدام MultiIndex، وأن str.fullmatch() يتحقق من توافق السلسلة بأكملها مع نمط معين. في الخطوة التالية، سنجمع عدة أعمدة نصية وننظفها.

البدء مجانًا

تعلم Python مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
30
الدروس
120

الأسئلة الشائعة

هل درس «مطابقة الأنماط باستخدام Regex» مجاني؟

نعم — نص درس «مطابقة الأنماط باستخدام Regex» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Pandas & NumPy Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.

ماذا ستتعلم في «مطابقة الأنماط باستخدام Regex»؟

استخرج السلاسل الفرعية وتحقق من الأنماط باستخدام .str.extract() و.str.contains() و.str.match() مع التعبيرات النمطية. تتمرن على Pandas & NumPy Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Pandas & NumPy Academy؟

لا تُشترط خبرة سابقة. Pandas & NumPy Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «مطابقة الأنماط باستخدام Regex»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Pandas & NumPy Academy هذا؟

نعم. كل درس في Pandas & NumPy Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. موصّل .str
  2. تقسيم السلاسل النصية واستبدالها
  3. مطابقة الأنماط باستخدام Regex
  4. دمج أعمدة النص وتنظيفها
← العودة إلى Pandas & NumPy Academy