الدالة re.compile()‎ في بايثون

من موسوعة حسوب
< Python‏ | re

تصرّف الدالة التعبير النمطي إلى كائن تعبير نمطي regex يمكن استخدامه للمطابقة بواسطة توابعه الخاصّة match()‎ و search() وغيرها.

البنية العامة

re.compile(pattern, flag=0)

المعاملات

pattern

التعبير النمطي المراد تصريفه.

flags

يمكن تحديد طريقة التعامل مع التعبير النمطي باستخدام قيم الرايات، ويمكن استخدام أكثر من راية وذلك بفصلها بعامل OR الخاص بالأعداد الثنائية (العامل |).

يمكن استخدام المتغيرات التالية كقيم للمعامل flags:

re.A

re.ASCII

يؤدي استخدام هذه الراية إلى جعل عملية المطابقة الخاصة بالتسلسلات ‎\w ،\W ،\b ،\B ،\d ،\D ،\s و ‎\S محصورة بالترميز ASCII عوضًا عن الترميز Unicode. تعمل هذه الراية مع أنماط Unicode فقط، ويتم تجاهلها في أنماط البايتات لأنّها تكون بلا معنى. هذه الراية مطابقة للراية السطرية (‎?a).

جدير بالذكر أنّه لغرض الإبقاء على التوافق مع الإصدارات القديمة، فإنّ الراية re.U لا زالت موجودة (إضافة إلى الراية المرادفة re.UNICODE والراية السطرية (‎?u)) ولكنّها أصبحت مهملة في الإصدار 3 من بايثون نظرًا لكون عمليات المطابقة في هذا الإصدار تجري ضمن ترميز Unicode بصورة افتراضية في السلاسلة النصية (ولا يسمح بإجراء المطابقة على البايتات باستخدام ترميز Unicode).

re.DEBUG

تعرض هذه الراية معلومات التنقيح الخاصة بالتعبير النمطي المصرّف، ولا وجود لراية ضمنية مماثلة.

re.I

re.IGNORECASE

يؤدي استخدام هذه الراية إلى تجاهل حالة الأحرف عند إجراء عملية المطابقة، وبهذا يطابق التعبير [A-Z] الأحرف الصغيرة أيضًا. ولا تقتصر عملية المطابقة على الحروف العادية، بل تتجاوزها إلى حروف Unicode برمّتها (كأن يطابق Ü الحرف ü)، إلا إذا استُخدمت الراية re.ASCII لتعطيل عمليات المطابقة خارج نطاق ترميز ASCII. لا تؤثر الإعدادات المحلية الحالية على عمل هذه الراية إلا إذا استُخدمت الراية re.LOCALE. الراية السطرية المقابلة هي (‎?i).

من الجدير بالذكر أنّه عند استخدام أنماط ‏Unicode‏ ‎[a-z]‎ أو [A-Z] إلى جانب الراية IGNORECASE فإنّ النمطين سيطابقان 52 حرفًا من حروف الترميز ASCII إلى جانب 4 أحرف خارج هذا الترميز وهي: 'İ' (حرف I اللاتيني الكبير مع نقطة فوقه، U+0130)، و 'ı' (حرف i اللاتيني الصغير بدون نقطة، U+0131)، و 'ſ' (حرف s الطويل اللاتيني الصغير، U+017F) و 'K' (علامة كلفن، U+212A). إن استخدمت الراية ASCII فستطابق الحروف 'a' إلى 'z' و 'A' إلى 'Z' فقط. (ولكن الراية تؤثر على التعبير النمطي بأكمله، لذا ينصح باستخدام التعبير ‎(?-i:[a-zA-Z])‎ في مثل هذه الحالات).

re.L

re.LOCALE

يؤدي استخدام هذه الراية إلى جعل عملية المطابقة باستخدام التسلسلات ‎\w، \W، \b، \B وعمليات المطابقة التي تكون حساسة لحالة الأحرف، تعتمد على الإعدادات المحلية. يمكن استخدام هذه الراية مع أنماط البايتات فقط، ولكن لا ينصح باستخدام هذه الراية نظرًا لعدم إمكانية الاعتماد على آلية عمل الإعدادات المحلية، إذ أنّها تتعامل مع "دولة culture" واحدة في الوقت ذاته، ولا تعمل إلا مع إعدادات 8-بت المحلية. يتيح الإصدار 3 من بايثون إجراء عمليات المطابقة للسلاسل النصية بترميز Unicode، إلى جانب قدرته على التعامل مع إعدادات محلية ولغات عالمية مختلفة. هذه الراية مطابقة للراية السطرية (‎?L).

ملاحظة: منذ الإصدار 3.6 من اللغة أصبح استخدام الراية re.LOCALE مقصورًا على أنماط البايتات، ولا يمكن استخدامها مع الراية re.ASCII.

re.M

re.MULTILINE

عند استخدام هذه الراية يطابق المحرف '^' في بداية السلسلة النصية وفي بداية كلّ سطر فيها (ما يأتي مباشرة بعد كل محرف سطر جديد)، ويطابق المحرف '$' في نهاية السلسلة النصية وفي نهاية كلّ سطر فيها (أي ما يسبق كل محرف سطر جديد مباشرة).

يطابق المحرف '^' بصورة افتراضية بداية السلسلة النصية فقط، ويطابق المحرف '$' نهايتها فقط، وقبل محرف السطر الجديد (إن وجد) في نهاية السلسلة النصية. هذه الراية مطابقة للراية السطرية (‎?m).

re.S

re.DOTALL

باستخدام هذه الراية سيطابق المحرف الخاص '.' جميع الحروف إلى جانب محرف السطر الجديد، وبدونها يطابق المحرف '.' جميع الحروف باستثناء محرف السطر الجديد.

هذه الراية مطابقة للراية السطرية (‎?s).

re.X

re.VERBOSE

تتيح هذه الراية كتابة تعابير نمطية ذات مظهر أجمل وأكثر مقروئية، وذلك بإتاحة إمكانية تقسيم التعبير النمطي إلى أقسام متعددة، وإضافة التعليقات إليه.

عادة ما يجري تجاهل المسافات البيضاء ضمن الأنماط، باستثناء الحالات التي تكون فيها موجودة ضمن فئة حرف، أو عندما تكون مسبوقة بخط مائل عكسي غير مهرّب، أو مع رموز مثل ‎*?‎، ‎(?:‎ أو ‎(?P<...>‎.

إن تضمّن سطر الرمز # خارج فئة حرف أو غير مسبوق بخط مائل عكسي غير مهرّب، فسيجري تجاهل جميع الحروف التي تأتي بعد هذا الرمز إلى نهاية السطر.

هذا يعني أنّ كائني التعبير النمطي التاليين -واللذين يطابقان أي عدد عشري- متماثلان:

a = re.compile(r"""\d +  # the integral part
                   \.    # the decimal point
                   \d *  # some fractional digits""", re.X)
b = re.compile(r"\d+\.\d*")

هذه الراية مطابقة للراية السطرية (‎?x).

القيمة المعادة

تعيد الدالة كائن regex الناتج عن تصريف التعبير النمطي المعطى.

أمثلة

يبين المثال التالي طريقة استخدام الدالة re.compile()‎:

prog = re.compile(pattern)
result = prog.match(string)

المثال السابق مطابق للمثال التالي:

result = re.match(pattern, string)

صحيح أنّ المثالين السابقين متطابقان من الناحية العملية، إلا أنّ استخدام الدالة re.compile()‎ وحفظ كائن التعبير النمطي الناتج عنها لإعادة استخدامه مرة أخرى يكون أكثر فعّالية عند وجود حاجة إلى استخدام التعبير النمطي نفسه عدة مرات في برنامج واحد. فيما يلي مثال عملي على استخدام الدالة:

>>> import re
>>> p = re.compile('[a-z]+')
>>> p
re.compile('[a-z]+')

ملاحظة: تخزّن النسخ المصرّفة حديثًا من التعابير النمطية الممرّرة إلى الدالة re.compile()‎ ودوال المطابقة على مستوى الوحدة في الذاكرة المخبئية، لهذا السبب لا حاجة إلى تصريف التعابير النمطية في البرامج التي تستخدم عددًا قليلًا منها.

انظر أيضًا

  • الدالة re.search() : تفحص الدالة السلسلة النصية بحثًا عن أول موقع يحصل فيه تطابق مع التعبير النمطي المعطى، وتعيد كائن match المقابل.
  • الدالة re.match()‎ : تفحص الدالة بداية السلسلة النصية بحثًا عن حالة تطابق مع التعبير النمطي المعطى، وتعيد كائن match المقابل.
  • التابع ()regex.match: يفحص هذا التابع بداية السلسلة النصية المعطاة بحثًا عن حالة تطابق مع التعبير النمطي المصرّف، ويعيد كائن التطابق المقابل.
  • التابع ()regex.search: يفحص هذا التابع السلسلة النصية المعطاة بحثًا عن أول موقع يحصل فيه تطابق مع التعبير النمطي المصرّف، ويعيد كائن التطابق المقابل.

مصادر