التعبيرات النمطية (RegEx): البحث المتقدم واستخراج النصوص المعقدة


مرحباً أيها المبرمجون! في هذا الدرس الاحترافي، سنغوص في عالم التعبيرات النمطية (RegEx) لنكشف عن قدرتها الخارقة في التعامل مع النصوص.

ماذا سنتعلم اليوم؟ سنتعلم كيفية استخدام RegEx في بايثون للبحث المتقدم واستخراج البيانات المعقدة من النصوص بكفاءة ودقة، مثل عناوين البريد الإلكتروني وأرقام الهواتف والتواريخ.

الخطوة 1: أساسيات RegEx في بايثون والبحث عن أنماط بسيطة

نبدأ بتضمين مكتبة re في بايثون، وهي المكتبة القياسية للتعامل مع التعبيرات النمطية. سنتعلم كيفية البحث عن كلمة بسيطة أو نمط متكرر.

ملاحظة تقنية: وظيفة re.findall() تبحث عن جميع التطابقات غير المتداخلة للنمط في السلسلة النصية وتعيدها كقائمة.

import re

# النص الذي سنعمل عليه
text = """
مرحباً بكم في أكاديمية البرمجة.
للتواصل معنا، يمكنكم إرسال بريد إلكتروني إلى info@example.com أو support@domain.net.
رقم الهاتف المباشر هو 050-1234567، ورقم آخر 010-9876543.
تاريخ اليوم 2023-10-26.
"""

# البحث عن جميع الكلمات التي تبدأ بحرف 'م'
pattern_simple = r'\bم\w+' # \b للحدود الكلمة، \w+ لأي حرف أو رقم متكرر مرة أو أكثر
found_simple = re.findall(pattern_simple, text)
print("الكلمات التي تبدأ بحرف 'م':", found_simple)

الخطوة 2: استخدام المجموعات (Groups) والمحددات الكمية (Quantifiers) لاستخراج البيانات

الآن، سنتقدم خطوة لاستخراج أنماط أكثر تعقيداً مثل عناوين البريد الإلكتروني. سنستخدم الأقواس () لإنشاء مجموعات لالتقاط أجزاء محددة، والمحددات الكمية مثل + (واحد أو أكثر) و * (صفر أو أكثر) و ? (صفر أو واحد) لتحديد تكرار الأحرف.

ملاحظة تقنية: \S+ يطابق أي حرف غير مسافة بيضاء مرة واحدة أو أكثر. [a-zA-Z0-9.-]+ يحدد الأحرف المسموح بها في اسم النطاق قبل اللاحقة.

# البحث عن عناوين البريد الإلكتروني
# النمط: (أحرف/أرقام/رموز) @ (أحرف/أرقام/رموز) . (أحرف/أرقام)
email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b' # نمط قياسي للبريد الإلكتروني
found_emails = re.findall(email_pattern, text)
print("عناوين البريد الإلكتروني المستخرجة:", found_emails)

الخطوة 3: استخراج أرقام الهواتف والتواريخ بأنماط معقدة

سنستخرج أرقام الهواتف والتواريخ التي تتبع تنسيقات محددة. هنا، سنرى كيف يمكن لـ RegEx التعامل مع التنسيقات المختلفة باستخدام مجموعات الاختيار | ومحددات الطول {}.

ملاحظة تقنية: \d يطابق أي رقم (0-9). {3} يحدد تكرار العنصر السابق 3 مرات بالضبط. (?:...) هي مجموعة غير ملتقطة، مفيدة لتجميع الأنماط دون إنشاء مجموعة التقاط إضافية.

# البحث عن أرقام الهواتف بتنسيق XXX-XXXXXXX
phone_pattern = r'\b\d{3}-\d{7}\b' # \d{3} لثلاثة أرقام، \d{7} لسبعة أرقام، مفصولة بشرطة
found_phones = re.findall(phone_pattern, text)
print("أرقام الهواتف المستخرجة:", found_phones)

# البحث عن التواريخ بتنسيق YYYY-MM-DD
date_pattern = r'\b\d{4}-\d{2}-\d{2}\b' # \d{4} للسنة، \d{2} للشهر واليوم
found_dates = re.findall(date_pattern, text)
print("التواريخ المستخرجة:", found_dates)

الكود النهائي الكامل

إليكم السكربت كاملاً الذي يجمع كل ما تعلمناه لاستخراج أنواع مختلفة من البيانات من نص واحد.

import re

# النص الذي سنعمل عليه
text = """
مرحباً بكم في أكاديمية البرمجة.
للتواصل معنا، يمكنكم إرسال بريد إلكتروني إلى info@example.com أو support@domain.net.
رقم الهاتف المباشر هو 050-1234567، ورقم آخر 010-9876543.
تاريخ اليوم 2023-10-26.
عنوان IP هو 192.168.1.1، وهناك أيضاً 10.0.0.5.
"""

# 1. البحث عن الكلمات التي تبدأ بحرف 'م'
pattern_simple = r'\bم\w+'
found_simple = re.findall(pattern_simple, text)
print("الكلمات التي تبدأ بحرف 'م':", found_simple)

# 2. البحث عن عناوين البريد الإلكتروني
email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
found_emails = re.findall(email_pattern, text)
print("عناوين البريد الإلكتروني المستخرجة:", found_emails)

# 3. البحث عن أرقام الهواتف بتنسيق XXX-XXXXXXX
phone_pattern = r'\b\d{3}-\d{7}\b'
found_phones = re.findall(phone_pattern, text)
print("أرقام الهواتف المستخرجة:", found_phones)

# 4. البحث عن التواريخ بتنسيق YYYY-MM-DD
date_pattern = r'\b\d{4}-\d{2}-\d{2}\b'
found_dates = re.findall(date_pattern, text)
print("التواريخ المستخرجة:", found_dates)

# مثال إضافي: البحث عن عناوين IP
ip_pattern = r'\b(?:\d{1,3}\.){3}\d{1,3}\b' # نمط لعناوين IP (مثال على استخدام المجموعات غير الملتقطة)
found_ips = re.findall(ip_pattern, text)
print("عناوين IP المستخرجة:", found_ips)

النتيجة المتوقعة

عند تشغيل السكربت أعلاه، ستحصل على مخرجات مطبوعة على الشاشة تعرض قوائم بالبيانات المستخرجة بنجاح من النص الأصلي، كل منها وفقاً للنمط المحدد:

الكلمات التي تبدأ بحرف 'م': ['مرحباً', 'مرحباً']
عناوين البريد الإلكتروني المستخرجة: ['info@example.com', 'support@domain.net']
أرقام الهواتف المستخرجة: ['050-1234567', '010-9876543']
التواريخ المستخرجة: ['2023-10-26']
عناوين IP المستخرجة: ['192.168.1.1', '10.0.0.5']

تهانينا! لقد أتقنت الآن أساسيات البحث المتقدم واستخراج النصوص المعقدة باستخدام التعبيرات النمطية في بايثون. يمكنك الآن تطبيق هذه المهارات في مشاريعك الخاصة لتحليل ومعالجة البيانات النصية بفعالية.