🔍 تعبيرات RegEx في بايثون: سوبرباور البحث في النصوص!
مرحباً بك في عالم تعبيرات RegEx (التعبيرات المنتظمة)! تخيل أن لديك كومة ضخمة من النصوص وتريد البحث عن جميع عناوين البريد الإلكتروني، أو أرقام الهواتف، أو حتى كلمات معينة بنمط محدد بداخلها. البحث اليدوي مستحيل، أليس كذلك؟ هنا يأتي دور RegEx كبطل خارق للبحث والتحقق من النصوص! في هذا الدرس، سنتعلم كيف نستخدم هذه الأداة القوية في بايثون بطريقة بسيطة وسهلة.
🤔 ما هي تعبيرات RegEx (التعبيرات المنتظمة)؟
التعبيرات المنتظمة (Regular Expressions) هي سلسلة من الرموز والحروف الخاصة التي تُشكِّل نمط بحث (Search Pattern). نستخدم هذا النمط للبحث داخل النصوص أو التحقق منها. فكر فيها كلغة سرية صغيرة تشرح للكمبيوتر ماذا تريد أن تجد بالضبط داخل أي نص.
الاستخدامات الشائعة:
- التحقق من صحة المدخلات: التأكد من أن البريد الإلكتروني المدخل من قبل المستخدم صحيح الشكل (يحتوي على @ و .com مثلاً).
- استخراج معلومات: استخراج جميع أرقام الهواتف من صفحة ويب أو مستند طويل.
- البحث والاستبدال الذكي: استبدال كل التواريخ المكتوبة بصيغة "يوم/شهر/سنة" إلى صيغة "سنة-شهر-يوم" بضغطة واحدة.
📚 مكتبة re في بايثون
بايثون توفر لنا مكتبة مدمجة جاهزة للتعامل مع تعبيرات RegEx تسمى re. كل ما علينا هو استيرادها في بداية البرنامج.
# الخطوة الأولى: استيراد المكتبة
import re
بمجرد استيراد re، يصبح لدينا مجموعة من الدوال السحرية للعمل مع الأنماط.
🔤 بناء نمط Regex بسيط
أبسط نمط regex هو مجرد النص نفسه الذي تريد البحث عنه. لنبدأ بمثال بسيط جداً.
import re
# النص الذي سنبحث بداخله
text = "أنا أحب البرمجة بلغة بايثون. بايثون لغة رائعة."
# 1. تعريف النمط: نريد البحث عن كلمة "بايثون"
pattern = r"Python" # الحرف 'r' قبل النص يجعل السلسلة "خام"، وهو أفضل ممارسة مع Regex.
# 2. استخدام دالة البحث: re.search()
result = re.search(pattern, text)
if result:
print("عثرنا على كلمة 'بايثون'!") # هذا ما سيتم طباعته
print("تم العثور عليها في الموضع:", result.start()) # موضع بداية الكلمة في النص
else:
print("لم يتم العثور على النمط.")
💡 شرح المثال:
pattern = r"بايثون": أنشأنا نمط البحث، وهو ببساطة كلمة "بايثون".re.search(pattern, text): تبحث هذه الدالة فيtextعن أول مرة يظهر فيهاpattern. إذا وجدت، تُرجع كائنMatchيحتوي على معلومات، وإلا تُرجعNone.result.start(): تعطينا موقع (فهرس) بداية المطابقة في النص الأصلي.
🛠 الدوال الأساسية في مكتبة re
لنكتشف معاً الدوال الأربع الأكثر استخداماً:
1. re.search() - البحث عن أول تطابق
كما رأينا، تجد أول تطابق للنمط في النص وتتوقف.
import re
text = "القطط جميلة. الكلاب وفية. القطط لطيفة."
pattern = r"القطط"
result = re.search(pattern, text)
print(result) # سيجد أول "القطط" فقط
2. re.findall() - إيجاد جميع التطابقات
هذه الدالة المفضلة! تُرجع قائمة (list) بكل النصوص التي تطابقت مع النمط.
import re
text = "القطط جميلة. الكلاب وفية. القطط لطيفة."
pattern = r"القطط"
all_matches = re.findall(pattern, text)
print(all_matches) # الإخراج: ['القطط', 'القطط']
print("عدد مرات التكرار:", len(all_matches)) # الإخراج: 2
3. re.match() - التحقق من بداية النص
تتحقق فقط مما إذا كان النمط يطابق بداية السلسلة النصية. إذا لم يكن في البداية، تفشل حتى لو كان النمط موجوداً لاحقاً.
import re
text1 = "بايثون هي الأفضل"
text2 = "أتعلم بايثون"
pattern = r"بايثون"
print(re.match(pattern, text1)) # سيتطابق (لأن النص يبدأ بـ"بايثون")
print(re.match(pattern, text2)) # لن يتطابق (لأن النص لا يبدأ بـ"بايثون")
4. re.sub() - البحث والاستبدال
تقوم باستبدال كل التطابقات التي تجدها بنص آخر تختاره. هذه الدالة قوية جداً!
import re
text = "اليوم هو 15/04/2024. الاجتماع السابق كان في 10/03/2024."
pattern = r"/" # النمط هو علامة الشرطة المائلة "/"
replacement = "-" # النص البديل هو الشرطة "-"
new_text = re.sub(pattern, replacement, text)
print(new_text)
# الإخراج: اليوم هو 15-04-2024. الاجتماع السابق كان في 10-03-2024.
✨ رموز خاصة في RegEx (مقدمة بسيطة)
لجعل الأنماط أكثر ذكاءً، نستخدم رموزاً خاصة. سنتعرف على اثنين أساسيين الآن:
-
النقطة
.: ترمز لأي حرف واحد (ما عدا سطر جديد).import re text = "قط، قطة، قطب، قطار" pattern = r"قط." # تبحث عن "قط" يليها أي حرف واحد matches = re.findall(pattern, text) print(matches) # الإخراج: ['قط،', 'قطة', 'قطب', 'قطار'] # لاحظ أن "قط" وحدها لم تظهر لأن النمط يتطلب حرفاً إضافياً. -
علامة الإضافة
+: تعني تكرار الحرف أو المجموعة السابقة مرة واحدة على الأقل.import re # نريد البحث عن أرقام في النص text = "هاتفي 1234567890 ورقم الطوارئ 911." pattern = r"\d+" # `\d` ترمز لأي رقم (0-9)، و `+` تعني "رقم واحد أو أكثر" phone_numbers = re.findall(pattern, text) print(phone_numbers) # الإخراج: ['1234567890', '911']
🧪 مثال تطبيقي شامل: البحث عن كلمات تبدأ بحرف معين
لنطبق ما تعلمناه في مثال بسيط ومفيد.
import re
# لدينا قائمة من الأسماء
text = "أحمد، محمد، علي، خالد، مريم، سارة"
# نريد جميع الأسماء التي تبدأ بحرف "أ"
pattern = r"أ\w+" # `\w` ترمز لأي حرف كلمة (حرف، رقم، أو _)
names_starting_with_alif = re.findall(pattern, text)
print("الأسماء التي تبدأ بـ 'أ':", names_starting_with_alif) # الإخراج: ['أحمد']
🎓 اختبر نفسك
التعليقات
شاركنا رأيك أو أسئلتك حول هذا المقال