التعبيرات العادية في بايثون

التعبيرات العادية في بايثون

تشرح هذه المقالة التعبيرات العادية في بايثون۔

سنغطي مجموعة واسعة من المواضيع، من الاستخدام الأساسي لوحدة re إلى التوافق مع الأنماط المعقدة للتعبيرات العادية.۔

YouTube Video

التعبيرات العادية في بايثون

تُستخدم وحدة re للبحث ومعالجة النصوص باستخدام التعبيرات العادية۔

ما هي وحدة re؟

تُدرج وحدة re في مكتبة بايثون القياسية وتوفر وظائف للتعامل مع النصوص باستخدام التعبيرات العادية۔ تُستخدم التعبيرات العادية للعثور بشكل فعّال على أنماط نصوص محددة أو استخراجها أو استبدالها۔

أنماط التعبيرات العادية الأساسية

تُعرّف التعبيرات العادية الأنماط باستخدام رموز خاصة۔ إليك بعض الأنماط الأساسية۔

  • .: أي حرف واحد
  • ^: بداية النص
  • $: نهاية النص
  • \d: أي رقم (0-9)
  • \w: أي حرف نصي (a-z، A-Z، 0-9، _)
  • \s: أي حرف فراغ
  • *: صفر أو أكثر من التكرارات
  • +: واحد أو أكثر من التكرارات
  • []: مجموعة حروف (مثل، [a-z] تطابق الأحرف الصغيرة)
 1import re
 2
 3pattern = r"\d{3}-\d{4}"
 4text = "My postal code is 123-4567."
 5result = re.search(pattern, text)
 6if result:
 7    print(result.group())  # Output: 123-4567
 8
 9# Define a pattern using basic regular expression symbols
10pattern = r"^\w+\s\d+\s[a-zA-Z]+$"
11
12# Example text to test the pattern
13text = "Room 23 Tokyo"
14
15# Check if the pattern matches the text
16result = re.match(pattern, text)
17if result:
18    print("Matched:", result.group())
19else:
20    print("No match")
  • يتحقق هذا الكود أولاً مما إذا كانت السلسلة تطابق نمط الرمز البريدي۔ بعد ذلك، يتحقق مما إذا كانت السلسلة كاملة (من البداية إلى النهاية) تطابق نمطًا يتكوّن من كلمة، ومسافة بيضاء، وأرقام، ومسافة بيضاء، وكلمة إنجليزية۔ يساعدك هذا على فهم كيفية دمج العناصر الأساسية للتعابير النمطية۔

كيفية استخدام وظائف المطابقة

re.match()

re.match() يتحقق من إذا ما كان بداية النص تطابق النمط المحدد۔

1import re
2
3pattern = r"\w+"
4text = "Python is powerful"
5match = re.match(pattern, text)
6if match:
7    print(match.group())  # Output: Python
  • يتحقق هذا الكود مما إذا كانت السلسلة تبدأ بمحرف كلمة (أبجدي رقمي أو شرطة سفلية)۔ الكلمة الأولى 'Python' تطابق النمط ويتم إخراجها۔

re.search()

re.search() يقوم بفحص النص بأكمله ويعيد أول تطابق۔

1import re
2
3pattern = r"powerful"
4text = "Python is powerful and versatile"
5search = re.search(pattern, text)
6if search:
7    print(search.group())  # Output: powerful
  • يبحث هذا الكود في السلسلة كاملة عن الكلمة 'powerful' ويعيد أول تطابق۔ ونتيجةً لذلك، تُخرج re.search() السلسلة المطابقة 'powerful'۔

re.findall()

re.findall() يعيد جميع التطابقات للنمط في شكل قائمة۔

1import re
2
3pattern = r"\b\w{6}\b"
4text = "Python is powerful and versatile"
5matches = re.findall(pattern, text)
6print(matches)  # Output: ['Python', 'strong']
  • يعثر هذا الكود على جميع الكلمات التي يبلغ طولها ستة محارف تمامًا ويعيدها على شكل قائمة۔ 'Python' في السلسلة يطابق الشرط، ويتم إخراج القائمة ['Python']۔

re.finditer()

re.finditer() يعيد جميع التطابقات ككائن تكراري، مما يتيح لك استرداد معلومات مفصلة لكل تطابق۔

1import re
2
3pattern = r"\b\w{6}\b"
4text = "Python is powerful and versatile"
5matches = re.finditer(pattern, text)
6for match in matches:
7    print(match.group())  # Output: Python
  • يبحث هذا الكود بالتتابع عن جميع الكلمات المكوّنة من ستة أحرف ويعالج كل تطابق عبر مُكرِّر۔ 'Python' يطابق النمط هنا ويتم إخراجه۔

الاستبدال والتقسيم

re.sub()

re.sub() يستبدل أجزاء من النص التي تطابق التعبير العادي بسلسلة نصية أخرى۔

1import re
2
3pattern = r"\d+"
4text = "There are 100 apples"
5new_text = re.sub(pattern, "many", text)
6print(new_text)  # Output: There are many apples
  • يستبدل هذا الكود جميع الأرقام في السلسلة بـ 'many'۔

re.split()

re.split() يقسم النص عند الأجزاء التي تطابق التعبير العادي۔

1import re
2
3pattern = r"\s+"
4text = "Python is powerful"
5parts = re.split(pattern, text)
6print(parts)  # Output: ['Python', 'is', 'powerful']
  • يقسم هذا الكود السلسلة عند محرف أو أكثر من المحارف البيضاء۔ ونتيجةً لذلك تُقسَّم السلسلة إلى كلمات، فنحصل على ['Python', 'is', 'powerful']۔

المجموعات والالتقاط

استخدام تجميع التعبيرات العادية يجعل استخراج النصوص الفرعية المتطابقة أمراً سهلاً۔ وضع النص بين أقواس () يلتقطه كمجموعة۔

1import re
2
3pattern = r"(\d{3})-(\d{4})"
4text = "My postal code is 123-4567."
5match = re.search(pattern, text)
6if match:
7    print(match.group(1))  # Output: 123
8    print(match.group(2))  # Output: 4567
  • يستخرج هذا الكود الرقمين المكوّنين من 3 أرقام و4 أرقام كمجموعتين منفصلتين من رمز بريدي بالشكل '123-4567'۔ تعيد group(1) الأرقام الثلاثة الأولى '123'، وتعيد group(2) الأرقام الأربعة الأخيرة '4567'۔

المجموعات المسماة

يتيح لك استخدام المجموعات المسماة جلب القيم بأسماء ذات دلالة بدلاً من الاعتماد على الفهارس۔ فيما يلي مثال ملموس يستخرج التاريخ والمستوى من سجل۔

1import re
2
3log = "2025-10-25 14:00:01 [ERROR] Something failed"
4
5pattern = r"(?P<date>\d{4}-\d{2}-\d{2}) (?P<time>\d{2}:\d{2}:\d{2}) \[(?P<level>[A-Z]+)\] (?P<msg>.*)"
6m = re.search(pattern, log)
7if m:
8    print(m.group("date"), m.group("time"), m.group("level"))
9    print("message:", m.group("msg"))
  • يستخدم هذا الكود مجموعات مسماة لاستخراج التاريخ والوقت والمستوى والرسالة من سلسلة سجل۔ يسترجع القيم باستخدام أسماء ذات دلالة بدلاً من الفهارس۔

استخدام خيارات الأعلام

وحدة re تحتوي على العديد من خيارات الأعلام للتحكم في سلوك البحث۔

  • re.IGNORECASE (re.I): خيار علم يجعل المطابقة غير حساسة لحالة الأحرف۔
  • re.MULTILINE (re.M): خيار علم يتيح المطابقة عبر عدة أسطر۔
  • re.DOTALL (re.S): خيار علم يجعل النقطة . تطابق أيضًا أحرف الخط الجديد۔
1import re
2
3pattern = r"python"
4text = "Python is powerful"
5match = re.search(pattern, text, re.IGNORECASE)
6if match:
7    print(match.group())  # Output: Python
  • يبحث هذا الكود عن الكلمة 'python' دون حساسية لحالة الأحرف۔ باستخدام العلم re.IGNORECASE، فإنه يطابق أيضًا 'Python'۔

مزايا كائنات التعابير النمطية (re.compile)

إن تجميع نمط باستخدام re.compile يجعل إعادة استخدامه أكثر كفاءة ويحسّن قابلية القراءة۔ يمكنك أيضًا تعيين الأعلام هنا۔

يبحث المثال التالي مرارًا عن التطابقات عبر عدة أسطر باستخدام نمط مُجمَّع۔ إذا كنت تستخدم النمط نفسه كثيرًا، فإن تجميعه باستخدام re.compile يحسّن الأداء۔

1import re
2
3pattern = re.compile(r"User: (\w+), ID: (\d+)")
4text = "User: alice, ID: 1\nUser: bob, ID: 2"
5
6for m in pattern.finditer(text):
7    print(m.groups())
  • يستخدم هذا الكود تعبيرًا نمطيًا مُجمَّعًا لاستخراج أسماء المستخدمين والمعرّفات من عدة أسطر۔ يحسّن re.compile الكفاءة عند إعادة استخدام النمط نفسه ويجعل الكود أكثر قابلية للقراءة أيضًا۔

التطبيقات

على سبيل المثال، اعتبر سكربت يستخرج جميع عناوين البريد الإلكتروني من ملف نصي۔

1import re
2
3pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
4text = "Contact us at info@example.com or support@service.com."
5emails = re.findall(pattern, text)
6print(emails)  # Output: ['info@example.com', 'support@service.com']
  • يعثر هذا الكود على جميع عناوين البريد الإلكتروني في السلسلة ويستخرجها كقائمة۔

الخاتمة

وحدة re هي أداة قوية لمعالجة النصوص في بايثون۔ شرحنا هنا نطاقًا واسعًا من الاستخدامات الأساسية إلى التعبيرات العادية المتقدمة باستخدام التجميع وخيارات الأعلام۔ التعبيرات العادية في بايثون قوية للغاية وأداة لا غنى عنها لمعالجة النصوص۔

يمكنك متابعة المقالة أعلاه باستخدام Visual Studio Code على قناتنا على YouTube.۔ يرجى التحقق من القناة على YouTube أيضًا.۔

YouTube Video