الفرق بين المراجعتين لصفحة: «Python/re/syntax»
لا ملخص تعديل |
لا ملخص تعديل |
||
(5 مراجعات متوسطة بواسطة مستخدم واحد آخر غير معروضة) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:صيغة التعابير النمطية في بايثون}}</noinclude> | |||
تستخدم التعابير النمطية لمطابقة مجموعة من الحروف في السلاسل النصية، وتسمح الدوال في هذه الوحدة بالتحقق من تطابق سلسلة نصّية معينة مع التعبير النمطي المعطى (أو من تطابق التعبير النمطي المعطى مع سلسلة نصّية معينة، والنتيجة في كلتا الحالتين واحدة). | تستخدم التعابير النمطية لمطابقة مجموعة من الحروف في السلاسل النصية، وتسمح الدوال في هذه الوحدة بالتحقق من تطابق سلسلة نصّية معينة مع التعبير النمطي المعطى (أو من تطابق التعبير النمطي المعطى مع سلسلة نصّية معينة، والنتيجة في كلتا الحالتين واحدة). | ||
يمكن ربط التعابير النمطية بعضها ببعض لتكوين تعابير نمطية جديدة، فعلى سبيل المثال إن كان A و B تعبيرين نمطيين فإنّ AB هو تعبير نمطيّ أيضًا. وبصورة عامة، إن كانت السلسلة p تطابق التعبير النمطي A وكانت سلسلة نصية أخرى q مطابقة للتعبير النمطي | يمكن ربط التعابير النمطية بعضها ببعض لتكوين تعابير نمطية جديدة، فعلى سبيل المثال إن كان <code>A</code> و <code>B</code> تعبيرين نمطيين فإنّ <code>AB</code> هو تعبير نمطيّ أيضًا. وبصورة عامة، إن كانت السلسلة <code>p</code> تطابق التعبير النمطي <code>A</code> وكانت سلسلة نصية أخرى <code>q</code> مطابقة للتعبير النمطي <code>B</code>، فإنّ السلسلة <code>pq</code> والناتجة عن ربط السلسلتين <code>p</code> و <code>q</code> تكون مطابقة للتعبير <code>AB</code>، إلا إذا تضمّن أحد التعبيرين عمليات ذات أولوية دنيا، أو شروطًا تضع حدودًا بين <code>A</code> و <code>B</code>، أو إشارات لمجموعات مرقمّة. | ||
هذا يعني أنّه يمكن وبكل سهولة إنشاء تعابير نمطية معقّدة باستخدام تعابير نمطية بسيطة كتلك الواردة في هذا القسم. | |||
يمكن أن تتضمن التعابير النمطية حروفًا عادية وأخرى خاصّة، ومعظم الحروف العادية مثل <code>'A'</code> أو <code>'a'</code> أو <code>'0'</code> هي أبسط شكل ممكن للتعابير النظامية، فهذه الحروف تطابق نفسها فقط. ويمكن ربط الحروف العادية بعضها ببعض، وهكذا تطابق الكلمة <code>last</code> السلسلة النصية <code>'last'</code>. | |||
'''ملاحظة''': سنستخدم هذا التنسيق <code>re</code> للتعابير النمطية دون إحاطتها بعلامات اقتباس، أما السلاسل النصية المراد مطابقتها فستكون <code>'محاطة بعلامات اقتباس مفردة'</code>). | |||
بعض الحروف مثل <code>'|'</code> أو <code>')'</code> تحمل معنىً خاصًّا، وهي إمّا ترمز إلى فئات الحروف الاعتيادية، أو تؤثّر على طريقة تفسير التعابير النمطية المحيطة بالحروف الاعتيادية. | |||
=== <code>^</code> === | لا يمكن استخدام رموز التكرار مثل (<code>*</code>، <code>+</code>، <code>?</code>، <code>{m,n}</code> ...إلخ.) على نحو متشعب مباشرة، وبهذا يمكن تجنّب اللبس الذي قد يحصل مع اللاحقة <code>?</code> ومع المعدِّلات الأخرى. ولتطبيق عملية تكرار على عملية تكرار أخرى، يمكن استخدام الأقواس الهلالية. فعلى سبيل المثال يطابق التعبير <code>(?:a{6})*</code> أي مضاعفات لستة محارف <code>'a'</code>. | ||
==الحروف الخاصة== | |||
يطابق هذا المحرف بداية السلسلة النصية، وعند تفعيل وضع الأسطر المتعددة MULTILINE فإنّ هذا المحرف يطابق مباشرة بعد كل سطر جديد. | ===<code>.</code>=== | ||
تطابق النقطة في الوضع الاعتيادي أي محرف باستثناء محرف السطر الجديد. وفي حال تعيين الراية <code>DOTALL</code> تطابق النقطة أيّ محرف إضافة إلى محرف السطر الجديد. | |||
=== <code>$</code> === | ===<code>^</code>=== | ||
يطابق هذا المحرف بداية السلسلة النصية، وعند تفعيل وضع الأسطر المتعددة <code>MULTILINE</code> فإنّ هذا المحرف يطابق مباشرة بعد كل سطر جديد. | |||
===<code>$</code>=== | |||
يطابق هذا المحرف نهاية السلسلة النصية أو ما قبل حرف السطر الجديد مباشرة في نهاية السلسلة النصية، وفي وضع الأسطر المتعددة يطابق هذا المحرف ما يسبق حرف السطر الجديد مباشرة. | يطابق هذا المحرف نهاية السلسلة النصية أو ما قبل حرف السطر الجديد مباشرة في نهاية السلسلة النصية، وفي وضع الأسطر المتعددة يطابق هذا المحرف ما يسبق حرف السطر الجديد مباشرة. | ||
يطابق النمط <code>foo</code> كلًّا من السلسلتين <code>'foo'</code> و <code>'foobar'</code>، ولكن التعبير النمطي <code>foo$</code> يطابق السلسلة <code>'foo'</code> فقط. أما البحث عن <code>foo.$</code> في السلسلة <code>'foo1\nfoo2\n'</code> فيطابق <code>'foo2'</code> كما هو متوقع، ولكنه يطابق <code>'foo1'</code> في وضع الأسطر المتعددة. | |||
يؤدي استخدام هذا | يؤدي البحث عن <code>$</code> فقط في السلسلة <code>'foo\n'</code> إلى العثور على تطابقين (فارغين)، الأول قبل السطر الجديد، والثاني في نهاية السلسلة النصية. | ||
===<code>*</code>=== | |||
يؤدي استخدام هذا المحرف إلى مطابقة ما يسبقه من التعابير النمطية مهما كان عدد تكرارها (0 أو أكثر من تكرار). فعلى سبيل المثال يطابق التعبير <code>ab*</code> السلسلة <code>'a'</code> أو <code>'ab'</code> أو <code>'a'</code> متبوعة بأيّ عددٍ من <code>'b'</code>. | |||
===<code>+</code>=== | |||
يؤدي استخدام هذا المحرف إلى مطابقة ما يسبقه من التعابير النمطية بشرط تكرارها مرة واحدة على الأقل (1 أو أكثر من تكرار). فمثلًا سيطابق التعبير <code>ab+</code> السلسلة <code>'a'</code> إذا كانت متبوعة بأي عدد من <code>'b'</code> ولكن لن يطابق السلسلة <code>'a'</code> وحدها. | |||
===<code>?</code>=== | |||
يؤدي استخدام هذا المحرف إلى مطابقة ما يسبقه بشرط تكراره مرة واحدة على الأكثر (0 أو 1 تكرار) . فمثلًا سيطابق التعبير <code>ab?</code> إحدى السلسلتين <code>'a'</code> أو <code>'ab'</code>. | |||
===<code>*?, +?, ??</code>=== | |||
تتّصف المحارف <code>'*'</code> و <code>'+'</code> و <code>'?'</code> بكونها محارف طمّاعة greedy، أي أنّها تطابق أكبر قدر ممكن من الحروف، ولكن قد لا يكون هذا السلوك مرغوبًا به في بعض الأحيان، فلو طُبّق التعبير النمطي <code><.*></code> على السلسلة النصية <code>'<a> b <c>'</code> فإنّه سيطابق السلسلة كلّها وليس الجزء <code>'<a>'</code> وحسب. | |||
=== | تؤدي إضافة المحرف <code>?</code> بعد الحروف الخاصة إلى تحويلها إلى حروف غير طمّاعة non-greedy، أي أنّها ستطابق أقلّ قدر ممكن من الحروف. وهكذا فإنّ استخدام التعبير <code><.*?></code> سيطابق <code>'<a>'</code> فقط. | ||
===<code>{m}</code>=== | |||
يحدّد هذا التعبير عدد مرات تكرار التعبير النمطي الذي يليه والذي يجب مطابقته ضمن السلسلة المعطاة. في حال كان عدد التطابقات السلسلة النصية المعطاء أقلّ من العدد المحدّد فإنّ التعبير النمطي لن يطابق السلسلة برمّتها. فعلى سبيل المثال يطابق التعبير <code>a{6}</code> بالضبط <code>6</code> أحرف <code>'a'</code> في السلسلة، لا أقل ولا أكثر. | |||
===<code>{m,n}</code>=== | |||
يؤدي استخدام هذا التعبير النمطي إلى مطابقة ما يسبقه من تعابير نمطية بشرط تكرارها من العدد <code>m</code> إلى العدد <code>n</code>، مع محاولة إيجاد أكبر عدد من حالات التطابق. | |||
فعلى سبيل المثال يطابق التعبير <code>a{3,5}</code> من <code>3</code> إلى <code>5</code> أحرف <code>'a'</code> في السلسلة النصية المعطاة. يؤدي حذف الرقم الأول <code>m</code> إلى تحويل الحد الأدنى إلى الصفر، ويؤدي حذف الرقم الثاني <code>n</code> إلى رفع الحد الأعلى إلى ما لا نهاية. | |||
=== | مثلًا يطابق النمط <code>a{4,}b</code> السلسلة النصية <code>'aaaab'</code> أو ألف حرف <code>'a'</code> متبوعًا بحرف <code>'b'</code> واحد فقط، ولكنّه لن يطابق السلسلة <code>'aaab'</code>. لا يمكن حذف الفاصلة <code>','</code> لأنّ ذلك سيؤدي إلى تحويل هذا القيد إلى القيد <code>{m}</code> الوارد ذكره في أعلاه. | ||
===<code>{m, n}?</code>=== | |||
يؤدي استخدام هذا القيد إلى مطابقة ما يسبقه من تعابير نمطية بشرط تكرارها من <code>m</code> إلى <code>n</code> مرة، مع محاولة إيجاد أقل عدد من التكرارات. | |||
هذه الصيغة هي الصيغة غير الطماعة للقيد السابق. فعلى سبيل المثال يؤدي تطبيق النمط <code>a{3,5}</code> على السلسلة النصية <code>'aaaaaa'</code> إلى مطابقة خمسة حروف، في حين يطابق النمط <code>a{3,5}?</code> ثلاثة حروف فقط. | |||
===<code>\</code>=== | |||
يؤدي هذا القيد وظيفتين، فإمّا أن يهرّب الحروف الخاصة ليسمح بمطابقة حروف مثل <code>'*'</code> و <code>'?'</code> وما شابهها، أو يشير إلى وجود تسلسل خاص (التسلسلات الخاصة مبيّنة أدناه). | |||
يجب الانتباه إلى أنّه في حال عدم استخدام السلاسل النصية الخام في بايثون فإنّ اللغة تستخدم الخط المائل العكسي كوسيلة لتهريب الحروف في السلاسل النصية، وإن لم يتعرّف مفسّر بايثون على الحروف المهرّبة فستتضمّن السلسلة النصية الناتجة الخط المائل العكسي وما يليه من الحروف. أما إن تمكّن المفسّر من التعرف على الحروف المهرّبة، فيجب حينئذٍ استخدام خطّين مائلين عكسيين. | |||
ونظرًا لأنّ هذه العملية معقدة وصعبة الفهم، يُنصح بشدّة استخدام السلاسل النصية الخام في جميع التعابير النمطية. | ونظرًا لأنّ هذه العملية معقدة وصعبة الفهم، يُنصح بشدّة استخدام السلاسل النصية الخام في جميع التعابير النمطية. | ||
===<code>[]</code>=== | |||
=== <code>[]</code> === | |||
تستخدم الأقواس المربعة للإشارة إلى مجموعة من الحروف. | تستخدم الأقواس المربعة للإشارة إلى مجموعة من الحروف. | ||
في المجموعة: | في المجموعة: | ||
* يمكن إدراج الحروف مفردة، مثل [amk] التي تطابق 'a' أو 'm' أو 'k'. | *يمكن إدراج الحروف مفردة، مثل <code>[amk]</code> التي تطابق <code>'a'</code> أو <code>'m'</code> أو <code>'k'</code>. | ||
* يمكن تحديد مديات من الحروف وذلك بتحديد حرفين وفصلهما بالحرف '-'، فعلى سبيل المثال يطابق التعبير [a-z] أي حرف صغير بترميز ASCII، ويطابق التعبير [0-5][0-9] جميع الأعداد ذات المرتبتين من العدد 00 إلى | *يمكن تحديد مديات من الحروف وذلك بتحديد حرفين وفصلهما بالحرف <code>'-'</code>، فعلى سبيل المثال يطابق التعبير <code>[a-z]</code> أي حرف صغير بترميز ASCII، ويطابق التعبير <code>[0-5][0-9]</code> جميع الأعداد ذات المرتبتين من العدد <code>00</code> إلى <code>59</code>، ويطابق التعبير <code>[0-9A-Fa-f]</code> جميع الأعداد الست عشرية. إن جرى تهريب المحرف <code>'-'</code> (مثل: <code>[a\-z])</code> أو إن كان هو الحرف الأول أو الأخير (مثل <code>[-a]</code> أو <code>[a-]</code>) فإنّ التعبير سيطابق المحرف <code>'-'</code> في السلسلة المعطاة. | ||
* تفقد الحروف الخاصّة معناها الخاصّ داخل المجموعات، فعلى سبيل المثال يطابق التعبير [(+*)] أي | *تفقد الحروف الخاصّة معناها الخاصّ داخل المجموعات، فعلى سبيل المثال يطابق التعبير <code>[(+*)]</code> أي محرف من المحارف <code>'('</code>، <code>'+'</code>، <code>'*'</code>، أو <code>')'</code>. | ||
* يمكن أيضًا استخدام فئات الحروف مثل \w أو \S (انظر أدناه) داخل المجموعات، ولكن الحروف التي ستطابقها هذه الفئات تعتمد على الوضع المستخدم، إمّا ASCII أو LOCALE. | *يمكن أيضًا استخدام فئات الحروف مثل <code>\w</code> أو <code>\S</code> (انظر أدناه) داخل المجموعات، ولكن الحروف التي ستطابقها هذه الفئات تعتمد على الوضع المستخدم، إمّا <code>ASCII</code> أو <code>LOCALE</code>. | ||
* يمكن مطابقة الحروف غير المنتمية إلى مدى معين عن طريق إكمال complementing المجموعة. إن كان الحرف الأول في المجموعة هو '^' فإنّ جميع الحروف غير الموجودة في المجموعة ستكون مطابقة. فمثلًا يطابق التعبير [^5] أي حرف باستثناء '5'، ويطابق التعبير [^^] جميع الحروف باسثتناء | *يمكن مطابقة الحروف غير المنتمية إلى مدى معين عن طريق إكمال complementing المجموعة. إن كان الحرف الأول في المجموعة هو <code>'^'</code> فإنّ جميع الحروف غير الموجودة في المجموعة ستكون مطابقة. فمثلًا يطابق التعبير <code>[^5]</code> أي حرف باستثناء <code>'5'</code>، ويطابق التعبير <code>[^^]</code> جميع الحروف باسثتناء المحرف <code>'^'</code>. لا يمتلك القيد <code>^</code> أي معنى خاص إن لم يرد في بداية المجموعة. | ||
* لمطابقة الحرف '[' داخل المجموعة يجب إضافة خط مائل عكسي قبله، أو وضع هذا الحرف في بداية المجموعة. فعلى سبيل المثال يطابق كلا التعبيرين [()[\]{}] و [{}]()[] حرف القوس. | *لمطابقة الحرف <code>'['</code> داخل المجموعة يجب إضافة خط مائل عكسي قبله، أو وضع هذا الحرف في بداية المجموعة. فعلى سبيل المثال يطابق كلا التعبيرين <code>[()[\]{}]</code> و <code>[{}]()[]</code> حرف القوس. | ||
===<code>|</code>=== | |||
=== <code>|</code> === | إن كان A و <code>B</code> تعبيرين نمطيين مختلفين، فإنّ <code>A|B</code> سيُنشئ تعبيرًا نمطيًا يطابق إمّا <code>A</code> أو <code>B</code>. ويمكن استخدام أكثر من تعبيرين بواسطة هذا القيد، ويمكن استخدامه كذلك داخل المجموعات (انظر أدناه). تُطبّق التعابير النمطية المفصولة بالقيد <code>'|'</code> من اليسار إلى اليمين، وعندما يطابق أحد التعابير النمطية بصورة تامة مع السلسلة النصية المعطاة، تتوقّف عملية البحث عند ذلك التعبير، بمعنى أنّه لو طابق التعبير <code>A</code> السلسلة النصية المعطاة فلن يُستخدم التعبير <code>B</code> وما بعده، حتى لو كانت النتيجة الحصول على تطابق أطول، وهذا يعني أنّ القيد <code>'|'</code> ليس طمّاعًا على الإطلاق. | ||
إن كان A و B تعبيرين نمطيين مختلفين، فإنّ A|B سيُنشئ تعبيرًا نمطيًا يطابق إمّا A أو B. ويمكن استخدام أكثر من تعبيرين بواسطة هذا | |||
=== <code>(...)</code> === | لمطابقة الحرف <code>'|'</code> يمكن استخدام التعبير <code>\|</code> أو إحاطته بقيد فئات الحروف مثل: <code>[|]</code>. | ||
===<code>(...)</code>=== | |||
يطابق هذا القيد أيّ تعبير نمطي محاط بالأقواس الهلالية، ويحدد بداية ونهاية المجموعة. يمكن استرجاع محتويات المجموعة بعد حدوث التطابق ثم مطابقة المحتويات في وقت لاحق ضمن السلسلة النصية باستخدام التسلسل الخاص <code>\number</code> (انظر أدناه). لمطابقة الحرف <code>'('</code> أو <code>')'</code> يمكن استخدام التعبير <code>\)</code> أو <code>\(</code> أو إحاطتهما بقيد فئات الحروف: <code>[(]</code> و <code>[)]</code>. | |||
===<code>(?...)</code>=== | |||
تستخدم هذه الصيغة للتعبير عن الملحقات extensions (ولكن لا يحمل الحرف <code>'?'</code> والمتبوع بالحرف <code>')'</code> أي معنى خاص). يحدّد الحرف الأول بعد الحرف <code>'?'</code> بنية الإضافة والمعنى الذي تحمله. ولا تنشئ الإضافات في العادة مجموعة جديدة باستثناء الملحق <code>(?P<name>...)</code>. وفيما يلي قائمة بالإضافات المتوفّرة: | |||
<code>(?aiLmsux)</code> | |||
(حرف واحد أو أكثر من المجموعة <code>'a'</code> ،<code>'i'</code> ،<code>'L'</code> ،<code>'m'</code> ،<code>'s'</code> ،<code>'u'</code> ،<code>'x'</code>). | |||
تطابق المجموعة السلسلة النصية الفارغة، أما الأحرف فتعيّن الراية المستخدمة في التعبير النمطي برمّته، وهي على النحو التالي: | تطابق المجموعة السلسلة النصية الفارغة، أما الأحرف فتعيّن الراية المستخدمة في التعبير النمطي برمّته، وهي على النحو التالي: | ||
re.A (مطابقة الحروف بترميز ASCII فقط) | *<code>re.A</code> (مطابقة الحروف بترميز ASCII فقط). | ||
*<code>re.I</code> (تجاهل حالة الأحرف). | |||
*<code>re.L</code> (الاعتماد على الإعدادات المحلية). | |||
*<code>re.M</code> (متعددة الأسطر). | |||
*<code>re.S</code> (جعل النقطة تطابق كل شيء). | |||
*<code>re.U</code> (مطابقة الحروف بترميز Unicode). | |||
*<code>re.X</code> (تعابير نمطية منسقة). | |||
(للتعرف على الرايات راجع قسم XXXXXXXX). | |||
هذه الطريقة مفيدة إن كنت ترغب في تضمين الرايات في التعابير النمطية لتكون جزءًا منها، بدلًا من تمرير الراية كمعامل إلى الدالة <code>[[Python/re/compile|re.compile()]]</code>. من الجدير بالذكر أنّه يجب استخدام الرايات أوّلًا في سلسلة التعبير النمطي. | |||
===<code>(?:...)</code>=== | |||
هذا القيد مشابه للأقواس الاعتيادية حيث يطابق أي تعبير نمطي داخل الأقواس، ولكنّ لا يمكن استعادة السلسلة الفرعية المطابقة بواسطة المجموعة بعد إجراء عملية المطابقة ولا يمكن الإشارة إليها في التعابير النمطية. | هذا القيد مشابه للأقواس الاعتيادية حيث يطابق أي تعبير نمطي داخل الأقواس، ولكنّ لا يمكن استعادة السلسلة الفرعية المطابقة بواسطة المجموعة بعد إجراء عملية المطابقة ولا يمكن الإشارة إليها في التعابير النمطية. | ||
===<code>(?imsx-imsx:...)</code>=== | |||
(صفر أو أكثر من الحروف في المجموعة <code>'i'</code>، <code>'m'</code>، <code>'s'</code>، <code>'x'</code>، ويمكن أن يتبعها المحرف <code>'-'</code> وهو أمر اختياري، ويتبعه حرف واحد أو أكثر من نفس المجموعة). تستخدم الحروف لتعيين أو إلغاء الرايات لجزء من التعبير النمطي، وهي على النحو التالي: | |||
*<code>re.i</code> (تجاهل حالة الأحرف) | |||
*<code>re.M</code> (متعدد الأسطر) | |||
*<code>re.S</code> (النقطة تطابق كلّ شيء) | |||
=== <code>(?P<name>...)</code> === | *<code>re.X</code> (تعابير نمطية منسقة). | ||
هذا القيد مشابه للأقواس الاعتيادية، ولكن يمكن الوصول إلى السلسلة الفرعية المطابقة عن طريق اسم المجموعة الرمزي name. يجب أن تكون أسماء المجموعات معرّفات بايثون صالحة، ويجب تعريف كل اسم مجموعة مرة واحدة فقط ضمن التعبير النمطي. المجموعة الرمزي هي مجموعة مرقّمة أيضًا، كما لو كانت المجموعة لا تحمل أي اسم على الإطلاق. | '''ملاحظة:''' هذا القيد جديد في الإصدار 3.6 من اللغة. | ||
===<code>(?P<name>...)</code>=== | |||
هذا القيد مشابه للأقواس الاعتيادية، ولكن يمكن الوصول إلى السلسلة الفرعية المطابقة عن طريق اسم المجموعة الرمزي <code>name</code>. يجب أن تكون أسماء المجموعات معرّفات بايثون صالحة، ويجب تعريف كل اسم مجموعة مرة واحدة فقط ضمن التعبير النمطي. المجموعة الرمزي هي مجموعة مرقّمة أيضًا، كما لو كانت المجموعة لا تحمل أي اسم على الإطلاق. | |||
سياق الإشارة إلى المجموعة "quote" | يمكن الإشارة إلى المجموعات المسمّاة في ثلاثة سياقات. إن كان النمط هو <code>?P<quote>['"]).*?(?P=quote)</code> (أي يطابق سلسلة نصية محاطة بعلامات اقتباس أحادية أو ثنائية): | ||
طرق الإشارة إليها | {| class="wikitable" | ||
ضمن النمط نفسه | !سياق الإشارة إلى المجموعة "quote" | ||
(?P=quote) (كما هو موضّح) | !طرق الإشارة إليها ضمن النمط نفسه | ||
\ | |- | ||
عند معالجة كائن التطابق | |ضمن التعبير النمطي ذاته | ||
m.group('quote') | | | ||
m.end('quote') | *<code>(?P=quote)</code> (كما هو موضّح) | ||
في سلسلة نصية تُمرّر إلى المعامل repl في الدالة re.sub() | *<code>\1</code> | ||
\g<quote> | |- | ||
|عند معالجة كائن التطابق | |||
| | |||
*<code>m.group('quote')</code> | |||
*<code>m.end('quote')</code> | |||
|- | |||
|في سلسلة نصية تُمرّر إلى المعامل <code>repl</code> في الدالة <code>re.sub()</code> | |||
| | |||
*<code>\g<quote></code> | |||
*<code>\g<1></code> | |||
*<code>\1</code> | |||
|} | |||
===<code>(?P=name)</code>=== | |||
إشارة راجعة إلى المجموعة المسماة، وتطابق أي نص جرت مطابقته بواسطة المجموعة المسمّاة <code>name</code> في القيد السابق. | |||
===<code>(?#...)</code>=== | |||
تستخدم هذه الصيغة لإضافة التعليقات، ويجري تجاهل المحتوى المحاط بالأقواس الهلالية. | تستخدم هذه الصيغة لإضافة التعليقات، ويجري تجاهل المحتوى المحاط بالأقواس الهلالية. | ||
===<code>(?=...)</code>=== | |||
يطابق هذا القيد إذا طابق التعبير النمطي الذي يلي علامة المساواة، ويسمّى هذا القيد بقيد التحقّق المسبق lookahead assertion. فعلى سبيل المثال يطابق التعبير <code>Isaac (?=Asimov)</code> السلسلة النصية <code>'Isacc '</code> في حالة واحدة فقط وهي أن تكون الكلمة متبوعة بالعبارة <code>'Asimov'</code>. | |||
===<code>(?!...)</code>=== | |||
يطابق هذا القيد إذا لم يطابق التعبير النمط الذي يلي علامة المساواة، ويسمّى هذا القيد بقيد التحقّق المسبق السلبي negative lookahead assertion. فعلى سبيل المثال يطابق التعبير <code>Isaac(?!Asimov)</code> السلسلة <code>'Isaac '</code> في حالة واحدة فقط وهي أن لا تكون متبوعة بالعبارة <code>'Asmiov'</code>. | |||
===<code>(?<=...)</code>=== | |||
يطابق هذا القيد إذا كان الموضع الحالي في السلسلة النصية مسبوقًا بحالة تطابق للتعبير النمطي الذي يلي علامة المساواة وتنتهي في الموقع الحالي. يسمّى هذا القيد بقيد التحقّق اللاحق الإيجابي (positive lookbehind assertion). | |||
على سبيل المثال سيعثر التعبير <code>(?<=abc)def</code> على حالة تطابق في السلسلة <code>'abcdef'</code>، لأنّ عملية التحقّق اللاحقة سترجع ثلاثة أحرف إلى الوراء وتتحقّق مما إذا كان النمط المعطى موجودًا في السلسلة النصية. يجب أن يطابق النمط المعطى سلاسل نصية ذات طول ثابت، وهذا يعني إمكانية استخدام تعابير مثل <code>abc</code> أو <code>a|b</code>، أما تعابير مثل <code>a*</code> و <code>a{3,4}</code> فغير مسموح بها. | |||
يجب الانتباه إلى أنّ الأنماط التي تبدأ بقيد تحقّق لاحق إيجابي لن تطابق في بداية السلسلة النصية المعطاة، وفي مثل هذه الحالات يجب استخدام الدالة <code>[[Python/re/search|search()]]</code> عوضًا عن الدالة <code>[[Python/re/match|match()]]</code>:<syntaxhighlight lang="python3"> | |||
>>> import re | >>> import re | ||
>>> m = re.search('(?<=abc)def', 'abcdef') | >>> m = re.search('(?<=abc)def', 'abcdef') | ||
>>> m.group(0) | >>> m.group(0) def' | ||
</syntaxhighlight>في هذا المثال يجري البحث عن كلمة تتبع الواصلة hyphen:<syntaxhighlight lang="python3"> | |||
في هذا المثال يجري البحث عن كلمة تتبع الواصلة hyphen: | |||
>>> m = re.search(r'(?<=-)\w+', 'spam-egg') | >>> m = re.search(r'(?<=-)\w+', 'spam-egg') | ||
>>> m.group(0) | >>> m.group(0) 'egg' | ||
'egg' | </syntaxhighlight>'''ملاحظة''': أصبحت اللغة تدعم إشارات المجموعات ذات الطول الثابت منذ الإصدار 3.5 من اللغة. | ||
===<code>(?<!...)</code>=== | |||
ملاحظة: أصبحت اللغة تدعم إشارات المجموعات ذات الطول الثابت منذ الإصدار 3.5 من اللغة. | |||
=== <code>(?<!...)</code> === | |||
يطابق هذا القيد إن لم يكن الموضع الحالي في السلسلة النصية مسبوقًا بحالة تطابق للتعبير النمطي الذي يلي علامة المساواة وتنتهي في الموقع الحالي. يسمى هذا القيد بقيد التحقق اللاحق السلبي. وكما هو الحال في قيد التحقق اللاحق الإيجابي، يجب أن يكون النمط المعطى مطابقًا لسلاسل نصية ذات طول ثابت. يمكن للأنماط التي تبدأ بقيد تحقق لاحق سلبي أن تطابق في بداية السلسلة النصية المعطاة. | يطابق هذا القيد إن لم يكن الموضع الحالي في السلسلة النصية مسبوقًا بحالة تطابق للتعبير النمطي الذي يلي علامة المساواة وتنتهي في الموقع الحالي. يسمى هذا القيد بقيد التحقق اللاحق السلبي. وكما هو الحال في قيد التحقق اللاحق الإيجابي، يجب أن يكون النمط المعطى مطابقًا لسلاسل نصية ذات طول ثابت. يمكن للأنماط التي تبدأ بقيد تحقق لاحق سلبي أن تطابق في بداية السلسلة النصية المعطاة. | ||
===<code>(?(id/name)yes-pattern|no-pattern)</code>=== | |||
يحاول هذا القيد أن يطابق النمط <code>yes-pattern</code> إن كانت المجموعة ذات المعرّف <code>id</code> او الاسم <code>name</code> موجودة، وأن يطابق النمط <code>no-pattern</code> إن كانت المجموعة غير موجودة. النمط <code>no-pattern</code> هو نمط اختياري ويمكن حذفه من القيد. على سبيل المثال يمثّل التعبير <code>(<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$)</code> تعبير مطابقة ضعيف لعناوين البريد الإلكتروني، حيث يطابق <code>'<user@host.com>'</code> و <code>'user@host.com'</code> ولكنّه لا يطابق <code>'<user@host.com'</code> ولا <code>'user@host.com>'</code>. | |||
=== <code>(?(id/name)yes-pattern|no-pattern)</code> === | ==التسلسلات الخاصة== | ||
يتكوّن التسلسل الخاص من المحرف <code>'\'</code> متبوعًا بأحد الأحرف الموجودة في القائمة أدناه. إن لم يكن الحرف الاعتيادي عددًا أو حرفًا ضمن الترميز ASCII فإنّ التعبير النمطي الناتج سيطابق الحرف الثاني. فمثلًا، يطابق التعبير <code>\$</code> الحرف <code>'$'</code>. | |||
يحاول هذا القيد أن يطابق النمط yes-pattern إن كانت المجموعة ذات المعرّف id او الاسم name موجودة، وأن يطابق النمط no-pattern إن كانت المجموعة غير موجودة. النمط no-pattern هو نمط اختياري ويمكن حذفه من القيد. | ===<code>\number</code>=== | ||
على سبيل المثال يمثّل التعبير (<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$) تعبير مطابقة ضعيف لعناوين البريد الإلكتروني، حيث يطابق '<user@host.com>' و 'user@host.com' ولكنّه لا يطابق '<user@host.com' ولا 'user@host.com>'. | يطابق محتويات المجموعة التي تحمل الرقم نفسه، ويبدأ ترقيم المجموعات من <code>1</code>. فعلى سبيل المثال يطابق التعبير <code>(.+) \1</code> السلسلة النصية <code>'the the'</code> أو <code>'55 55'</code> ولكنه لن يطابق <code>'thethe'</code> (لاحظ وجود فاصلة بيضاء بعد المجموعة). يمكن استخدام هذا التسلسل الخاص لمطابقة أول 99 مجموعة. إن كانت المرتبة الأولى من <code>number</code> هي <code>0</code>، أو كان <code>number</code> عددًا مكوّنًا من ثلاثة أعداد في النظام الثماني، فلن يُفسّر كتطابق للمجموعة، بل كحرف يمتلك قيمة <code>number</code> في النظام الثماني. تعامل جميع عمليات تهريب الأعداد ضمن <code>'['</code> و <code>']'</code> في فئات الحروف معاملة الأحرف. | ||
===<code>\A</code>=== | |||
== التسلسلات الخاصة == | |||
يتكوّن التسلسل الخاص من | |||
=== <code>\number</code> === | |||
يطابق محتويات المجموعة التي تحمل الرقم نفسه، ويبدأ ترقيم المجموعات من 1. فعلى سبيل المثال يطابق التعبير (.+) \ | |||
=== <code>\A</code> === | |||
يطابق بداية السلسلة النصية فقط. | يطابق بداية السلسلة النصية فقط. | ||
===<code>\b</code>=== | |||
يطابق السلسلة النصية الفارغة، ولكن في بداية أو نهاية الكلمة فقط، والكلمة هي تسلسل من الحروف. يمكن تعريف التسلسل <code>\b</code> بأنّه الحدّ الفاصل بين حرف من التسلسل <code>\w</code> و <code>\W</code> (أو العكس)، أو بين التسلسل <code>\w</code> وبداية أو نهاية السلسلة النصية. هذا يعني أنّ التعبير <code>r'\bfoo\b'</code> يطابق كلًّا من <code>'foo'</code> و <code>'foo.'</code> و <code>'(foo)'</code> و <code>'bar foo baz'</code> ولكن لا تطابق <code>'foobar'</code> أو <code>'foo3'</code>. تُستخدم حروف وأرقام الترميز Unicode بصورة افتراضية لإنشاء أنماط بهذا الترميز، ولكن يمكن تغيير الترميز باستخدام راية ASCII. تُعيّن حدود الكلمات باستخدام الإعدادات المحلية إن استُخدمت الراية <code>LOCALE</code>. ولغرض التوافق مع السلاسل النصية في بايثون، فإنّ <code>\b</code> تمثّل حرف المسافة الخلفية backspace ضمن مدًى من الحروف. | |||
===<code>\B</code>=== | |||
يطابق هذا التسلسل السلسلة الفارغة ولكن عندما لا تكون في بداية الكلمة أو نهايتها. وهذا يعني أنّ النمط <code>r'py\B'</code> يطابق كلًّا من <code>'python'</code> و <code>'py3'</code> و <code>'py2'</code> ولكن لا يطابق <code>'py'</code> ولا <code>'py.'</code> ولا <code>'py!'</code>. هذا التسلسل هو معكوس التسلسل <code>\b</code>، لذا فإنّ الحروف في أنماط Unicode هي حروف وأرقام هذا الترميز أو الشرطة السفلية، ويمكن تغيير الترميز باستخدام الراية <code>ASCII</code>. تُعيّن حدود الكلمة عن طريق الإعدادات المحلية إن جرى استخدام الراية <code>LOCALE</code>. | |||
===<code>\d</code>=== | |||
'''أنماط Unicode (السلاسل النصية):''' يطابق هذا التسلسل اخلاص أي عدد بترميز Unicode في النظام العشري (أي الحروف التي تندرج ضمن التصنيف <code>[Nd]</code> في ترميز Unicode) وتشمل الأعداد <code>[0-9]</code> إضافة إلى الأشكال الأخرى من الأعداد ضمن هذا الترميز. إن استخدمت الراية <code>ASCII</code> فإنّ هذا التسلسل سيطابق الأعداد <code>[0-9]</code> فقط (ولكن تطبيق الراية سيؤثّر على التعبير النمطي بأكمله، وفي مثل هذه الحالة يفضّل استخدام التعبير <code>[0-9]</code> عوضًا عن هذا التسلسل). | |||
=== <code>\ | '''أنماط 8-بت (البايتات):''' يطابق هذا التسلسل أي عدد في النظام العشري، وهذا يكافئ القيد <code>[0-9]</code>. | ||
===<code>\D</code>=== | |||
يطابق أي محرف لا يكون عددًا في النظام العشري، وهو التسلسل المعاكس للتسلسل <code>\d</code>. وإن استُخدمت الراية <code>ASCII</code> فإنّ هذا التسلسل يصبح مكافئًا للتعبير <code>[^0-9]</code>. (ولكن تطبيق الراية سيؤثّر على التعبير النمطي بأكمله، وفي مثل هذه الحالة يفضّل استخدام التعبير <code>[^0-9]</code> عوضًا عن هذا التسلسل). | |||
===<code>\s</code>=== | |||
'''أنماط Unicode (السلاسل النصية):''' يطابق محرف المسافة البيضاء في ترميز Unicode (والتي تتضمن <code>[ \t\n\r\f\v]</code> وغيرها الكثير من المحارف مثل المسافات غير المقطوعة non-breaking spaces والتي تكون إلزامية حسب قواعد الكتابة في بعض اللغات). إن استُخدمت الراية ASCII فإن التعبير <code>[ \t\n\r\f\v]</code> هو الذي سيطابق فقط، (ولكن تطبيق الراية سيؤثّر على التعبير النمطي بأكمله، وفي مثل هذه الحالة يفضّل استخدام القيد <code>[ \t\n\r\f\v]</code> عوضًا عن هذا التسلسل). | |||
'''أنماط 8- بت (البايتات):''' تطابق المحارف التي تعدّ مسافات بيضاء في ترميز ASCII، وهذا يكافئ التعبير <code>[ \t\n\r\f\v]</code>. | |||
===<code>\S</code>=== | |||
يطابق أي محرف لا يعدّ محرف مسافة بيضاء، وهو التسلسل المعاكس للتسلسل <code>\s</code>. إن استُخدمت الراية ASCII فإن هذا التسلسل يصبح مكافِئًا للتعبير <code>[^ \t\n\r\f\v]</code> (ولكن تطبيق الراية سيؤثّر على التعبير النمطي بأكمله، وفي مثل هذه الحالة يفضّل استخدام القيد <code>[^ \t\n\r\f\v]</code> عوضًا عن هذا التسلسل). | |||
===<code>\w</code>=== | |||
'''أنماط Unicode (السلاسل النصية):''' يطابق محارف الكلمات في ترميز Unicode، وهذا يتضمّن معظم المحارف التي يمكن أن تكون جزءًا من كلمات اللغات المختلفة، إضافة إلى الأرقام والشرطة السفلية. إن استُخدمت الراية ASCII فإنّ التعبير [a-zA-Z0-9_] هو الذي سيطابق فقط (ولكن تطبيق الراية سيؤثّر على التعبير النمطي بأكمله، وفي مثل هذه الحالة يفضّل استخدام القيد [a-zA-Z0-9_] عوضًا عن هذا التسلسل). | |||
'''أنماط 8-بت (البايتات):''' يطابق المحارف التي تعدّ أرقامًا وحروفًا في مجموعة محارف ASCII، وهذا مكافئ للتعبير <code>[a-zA-Z0-9_]</code>. إن استخدمت الراية <code>LOCALE</code> فإنّ هذا التسلسل الخاص يطابق المحارف التي تعدّ حروفًا وأرقامًا في الإعدادات المحلية الحالية إضافة إلى الشرطة السفلية. | |||
===<code>\W</code>=== | |||
يطابق أي محرف لا يكون من محارف الكلمات، وهو التسلسل المعاكس للتسلسل <code>\w</code>. إن استخدمت الراية ASCII فإنّ التسلسل يصبح مكافئًا للتعبير <code>[^a-zA-Z0-9_]</code> (لكن تطبيق الراية سيؤثّر على التعبير النمطي بأكمله، وفي مثل هذه الحالة يفضّل استخدام القيد <code>[^a-zA-Z0-9_]</code> عوضًا عن هذا التسلسل). إن استُخدمت الراية <code>LOCALE</code> فإنّ التسلسل سيطابق المحارف التي تعدّ حروفًا وارقامًا في الإعدادات المحلية الحالية إضافة إلى الشرطة السفلية. | |||
===<code>\Z</code>=== | |||
يطابق هذا التسلسل في نهاية السلسلة النصية فقط. | |||
== | == استخدام علامات التهريب القياسية في بايثون ضمن التعابير النمطية == | ||
يمكن استخدام معظم علامات التهريب القياسية المستخدمة في سلاسل بايثون النصية ضمن التعابير النمطية:<syntaxhighlight lang="python3"> | |||
\a \b \f \n | |||
\r \t \u \U | |||
\v \x \\ | |||
</syntaxhighlight>(لاحظ أنّ <code>\b</code> يستخدم لتمثيل حدود الكلمة، ويعني المسافة الخلفية backspace داخل فئات الحروف فقط). يتعرّف مفسّر التعبيرات النمطية على تسلسلي <code>'\u'</code> و <code>'\U'</code> في أنماط Unicode فقط، ولكنّها تعدّ أخطاءً في أنماط البايتات. | |||
يمكن استخدام تسلسلات التهريب الثمانية ولكن ضمن نطاق ضيق، فإن كان العدد الأول هو <code>0</code>، أو كان هناك ثلاثة أعداد من النظام الثماني، فإنّ التسلسل يعدّ تسلسل تهريب ثماني، وباستثناء ما سبق فإنّه يعدّ إشارة مجموعة. وكما هو الحال مع تسلسلات التهريب في السلاسل النصية، فإنّ تسلسلات التهريب الثمانية يجب أن تتضمّن ثلاثة أعداد فقط. | |||
'''ملاحظة:''' أضيف التسلسلان <code>'\u'</code> و <code>'\U'</code> في الإصدار 3.3 من اللغة. | |||
'''ملاحظة:''' أصبحت التسلسلات المجهولة والتي تتضمن الحرف <code>'\'</code> إلى جانب أحد حروف ASCII تعدّ أخطاءً في الإصدار 3.6 من اللغة. | |||
== انظر أيضًا == | |||
* [[Python/str|السلاسل النصية في بايثون.]] | |||
* [[Python/bytes|البايتات في بايثون.]] | |||
== مصادر == | |||
* [https://docs.python.org/3/library/re.html#regular-expression-syntax قسم Regular Expression Syntax في صفحة Regular expression operations في توثيق بايثون الرسمي.] | |||
[[تصنيف:Python]] | |||
[[تصنيف:Python Regular Expressions]] | |||
[[تصنيف:Python re]] |
المراجعة الحالية بتاريخ 06:34، 18 يونيو 2018
تستخدم التعابير النمطية لمطابقة مجموعة من الحروف في السلاسل النصية، وتسمح الدوال في هذه الوحدة بالتحقق من تطابق سلسلة نصّية معينة مع التعبير النمطي المعطى (أو من تطابق التعبير النمطي المعطى مع سلسلة نصّية معينة، والنتيجة في كلتا الحالتين واحدة).
يمكن ربط التعابير النمطية بعضها ببعض لتكوين تعابير نمطية جديدة، فعلى سبيل المثال إن كان A
و B
تعبيرين نمطيين فإنّ AB
هو تعبير نمطيّ أيضًا. وبصورة عامة، إن كانت السلسلة p
تطابق التعبير النمطي A
وكانت سلسلة نصية أخرى q
مطابقة للتعبير النمطي B
، فإنّ السلسلة pq
والناتجة عن ربط السلسلتين p
و q
تكون مطابقة للتعبير AB
، إلا إذا تضمّن أحد التعبيرين عمليات ذات أولوية دنيا، أو شروطًا تضع حدودًا بين A
و B
، أو إشارات لمجموعات مرقمّة.
هذا يعني أنّه يمكن وبكل سهولة إنشاء تعابير نمطية معقّدة باستخدام تعابير نمطية بسيطة كتلك الواردة في هذا القسم.
يمكن أن تتضمن التعابير النمطية حروفًا عادية وأخرى خاصّة، ومعظم الحروف العادية مثل 'A'
أو 'a'
أو '0'
هي أبسط شكل ممكن للتعابير النظامية، فهذه الحروف تطابق نفسها فقط. ويمكن ربط الحروف العادية بعضها ببعض، وهكذا تطابق الكلمة last
السلسلة النصية 'last'
.
ملاحظة: سنستخدم هذا التنسيق re
للتعابير النمطية دون إحاطتها بعلامات اقتباس، أما السلاسل النصية المراد مطابقتها فستكون 'محاطة بعلامات اقتباس مفردة'
).
بعض الحروف مثل '|'
أو ')'
تحمل معنىً خاصًّا، وهي إمّا ترمز إلى فئات الحروف الاعتيادية، أو تؤثّر على طريقة تفسير التعابير النمطية المحيطة بالحروف الاعتيادية.
لا يمكن استخدام رموز التكرار مثل (*
، +
، ?
، {m,n}
...إلخ.) على نحو متشعب مباشرة، وبهذا يمكن تجنّب اللبس الذي قد يحصل مع اللاحقة ?
ومع المعدِّلات الأخرى. ولتطبيق عملية تكرار على عملية تكرار أخرى، يمكن استخدام الأقواس الهلالية. فعلى سبيل المثال يطابق التعبير (?:a{6})*
أي مضاعفات لستة محارف 'a'
.
الحروف الخاصة
.
تطابق النقطة في الوضع الاعتيادي أي محرف باستثناء محرف السطر الجديد. وفي حال تعيين الراية DOTALL
تطابق النقطة أيّ محرف إضافة إلى محرف السطر الجديد.
^
يطابق هذا المحرف بداية السلسلة النصية، وعند تفعيل وضع الأسطر المتعددة MULTILINE
فإنّ هذا المحرف يطابق مباشرة بعد كل سطر جديد.
$
يطابق هذا المحرف نهاية السلسلة النصية أو ما قبل حرف السطر الجديد مباشرة في نهاية السلسلة النصية، وفي وضع الأسطر المتعددة يطابق هذا المحرف ما يسبق حرف السطر الجديد مباشرة.
يطابق النمط foo
كلًّا من السلسلتين 'foo'
و 'foobar'
، ولكن التعبير النمطي foo$
يطابق السلسلة 'foo'
فقط. أما البحث عن foo.$
في السلسلة 'foo1\nfoo2\n'
فيطابق 'foo2'
كما هو متوقع، ولكنه يطابق 'foo1'
في وضع الأسطر المتعددة.
يؤدي البحث عن $
فقط في السلسلة 'foo\n'
إلى العثور على تطابقين (فارغين)، الأول قبل السطر الجديد، والثاني في نهاية السلسلة النصية.
*
يؤدي استخدام هذا المحرف إلى مطابقة ما يسبقه من التعابير النمطية مهما كان عدد تكرارها (0 أو أكثر من تكرار). فعلى سبيل المثال يطابق التعبير ab*
السلسلة 'a'
أو 'ab'
أو 'a'
متبوعة بأيّ عددٍ من 'b'
.
+
يؤدي استخدام هذا المحرف إلى مطابقة ما يسبقه من التعابير النمطية بشرط تكرارها مرة واحدة على الأقل (1 أو أكثر من تكرار). فمثلًا سيطابق التعبير ab+
السلسلة 'a'
إذا كانت متبوعة بأي عدد من 'b'
ولكن لن يطابق السلسلة 'a'
وحدها.
?
يؤدي استخدام هذا المحرف إلى مطابقة ما يسبقه بشرط تكراره مرة واحدة على الأكثر (0 أو 1 تكرار) . فمثلًا سيطابق التعبير ab?
إحدى السلسلتين 'a'
أو 'ab'
.
*?, +?, ??
تتّصف المحارف '*'
و '+'
و '?'
بكونها محارف طمّاعة greedy، أي أنّها تطابق أكبر قدر ممكن من الحروف، ولكن قد لا يكون هذا السلوك مرغوبًا به في بعض الأحيان، فلو طُبّق التعبير النمطي <.*>
على السلسلة النصية '<a> b <c>'
فإنّه سيطابق السلسلة كلّها وليس الجزء '<a>'
وحسب.
تؤدي إضافة المحرف ?
بعد الحروف الخاصة إلى تحويلها إلى حروف غير طمّاعة non-greedy، أي أنّها ستطابق أقلّ قدر ممكن من الحروف. وهكذا فإنّ استخدام التعبير <.*?>
سيطابق '<a>'
فقط.
{m}
يحدّد هذا التعبير عدد مرات تكرار التعبير النمطي الذي يليه والذي يجب مطابقته ضمن السلسلة المعطاة. في حال كان عدد التطابقات السلسلة النصية المعطاء أقلّ من العدد المحدّد فإنّ التعبير النمطي لن يطابق السلسلة برمّتها. فعلى سبيل المثال يطابق التعبير a{6}
بالضبط 6
أحرف 'a'
في السلسلة، لا أقل ولا أكثر.
{m,n}
يؤدي استخدام هذا التعبير النمطي إلى مطابقة ما يسبقه من تعابير نمطية بشرط تكرارها من العدد m
إلى العدد n
، مع محاولة إيجاد أكبر عدد من حالات التطابق.
فعلى سبيل المثال يطابق التعبير a{3,5}
من 3
إلى 5
أحرف 'a'
في السلسلة النصية المعطاة. يؤدي حذف الرقم الأول m
إلى تحويل الحد الأدنى إلى الصفر، ويؤدي حذف الرقم الثاني n
إلى رفع الحد الأعلى إلى ما لا نهاية.
مثلًا يطابق النمط a{4,}b
السلسلة النصية 'aaaab'
أو ألف حرف 'a'
متبوعًا بحرف 'b'
واحد فقط، ولكنّه لن يطابق السلسلة 'aaab'
. لا يمكن حذف الفاصلة ','
لأنّ ذلك سيؤدي إلى تحويل هذا القيد إلى القيد {m}
الوارد ذكره في أعلاه.
{m, n}?
يؤدي استخدام هذا القيد إلى مطابقة ما يسبقه من تعابير نمطية بشرط تكرارها من m
إلى n
مرة، مع محاولة إيجاد أقل عدد من التكرارات.
هذه الصيغة هي الصيغة غير الطماعة للقيد السابق. فعلى سبيل المثال يؤدي تطبيق النمط a{3,5}
على السلسلة النصية 'aaaaaa'
إلى مطابقة خمسة حروف، في حين يطابق النمط a{3,5}?
ثلاثة حروف فقط.
\
يؤدي هذا القيد وظيفتين، فإمّا أن يهرّب الحروف الخاصة ليسمح بمطابقة حروف مثل '*'
و '?'
وما شابهها، أو يشير إلى وجود تسلسل خاص (التسلسلات الخاصة مبيّنة أدناه).
يجب الانتباه إلى أنّه في حال عدم استخدام السلاسل النصية الخام في بايثون فإنّ اللغة تستخدم الخط المائل العكسي كوسيلة لتهريب الحروف في السلاسل النصية، وإن لم يتعرّف مفسّر بايثون على الحروف المهرّبة فستتضمّن السلسلة النصية الناتجة الخط المائل العكسي وما يليه من الحروف. أما إن تمكّن المفسّر من التعرف على الحروف المهرّبة، فيجب حينئذٍ استخدام خطّين مائلين عكسيين.
ونظرًا لأنّ هذه العملية معقدة وصعبة الفهم، يُنصح بشدّة استخدام السلاسل النصية الخام في جميع التعابير النمطية.
[]
تستخدم الأقواس المربعة للإشارة إلى مجموعة من الحروف.
في المجموعة:
- يمكن إدراج الحروف مفردة، مثل
[amk]
التي تطابق'a'
أو'm'
أو'k'
. - يمكن تحديد مديات من الحروف وذلك بتحديد حرفين وفصلهما بالحرف
'-'
، فعلى سبيل المثال يطابق التعبير[a-z]
أي حرف صغير بترميز ASCII، ويطابق التعبير [0-5][0-9]
جميع الأعداد ذات المرتبتين من العدد00
إلى59
، ويطابق التعبير[0-9A-Fa-f]
جميع الأعداد الست عشرية. إن جرى تهريب المحرف'-'
(مثل:[a\-z])
أو إن كان هو الحرف الأول أو الأخير (مثل [-a]
أو[a-]
) فإنّ التعبير سيطابق المحرف'-'
في السلسلة المعطاة. - تفقد الحروف الخاصّة معناها الخاصّ داخل المجموعات، فعلى سبيل المثال يطابق التعبير
[(+*)]
أي محرف من المحارف'('
،'+'
،'*'
، أو')'
. - يمكن أيضًا استخدام فئات الحروف مثل
\w
أو\S
(انظر أدناه) داخل المجموعات، ولكن الحروف التي ستطابقها هذه الفئات تعتمد على الوضع المستخدم، إمّاASCII
أوLOCALE
. - يمكن مطابقة الحروف غير المنتمية إلى مدى معين عن طريق إكمال complementing المجموعة. إن كان الحرف الأول في المجموعة هو
'^'
فإنّ جميع الحروف غير الموجودة في المجموعة ستكون مطابقة. فمثلًا يطابق التعبير[^5]
أي حرف باستثناء'5'
، ويطابق التعبير[^^]
جميع الحروف باسثتناء المحرف'^'
. لا يمتلك القيد^
أي معنى خاص إن لم يرد في بداية المجموعة. - لمطابقة الحرف
'['
داخل المجموعة يجب إضافة خط مائل عكسي قبله، أو وضع هذا الحرف في بداية المجموعة. فعلى سبيل المثال يطابق كلا التعبيرين[()[\]{}]
و[{}]()[]
حرف القوس.
|
إن كان A و B
تعبيرين نمطيين مختلفين، فإنّ A|B
سيُنشئ تعبيرًا نمطيًا يطابق إمّا A
أو B
. ويمكن استخدام أكثر من تعبيرين بواسطة هذا القيد، ويمكن استخدامه كذلك داخل المجموعات (انظر أدناه). تُطبّق التعابير النمطية المفصولة بالقيد '|'
من اليسار إلى اليمين، وعندما يطابق أحد التعابير النمطية بصورة تامة مع السلسلة النصية المعطاة، تتوقّف عملية البحث عند ذلك التعبير، بمعنى أنّه لو طابق التعبير A
السلسلة النصية المعطاة فلن يُستخدم التعبير B
وما بعده، حتى لو كانت النتيجة الحصول على تطابق أطول، وهذا يعني أنّ القيد '|'
ليس طمّاعًا على الإطلاق.
لمطابقة الحرف '|'
يمكن استخدام التعبير \|
أو إحاطته بقيد فئات الحروف مثل: [|]
.
(...)
يطابق هذا القيد أيّ تعبير نمطي محاط بالأقواس الهلالية، ويحدد بداية ونهاية المجموعة. يمكن استرجاع محتويات المجموعة بعد حدوث التطابق ثم مطابقة المحتويات في وقت لاحق ضمن السلسلة النصية باستخدام التسلسل الخاص \number
(انظر أدناه). لمطابقة الحرف '('
أو ')'
يمكن استخدام التعبير \)
أو \(
أو إحاطتهما بقيد فئات الحروف: [(]
و [)]
.
(?...)
تستخدم هذه الصيغة للتعبير عن الملحقات extensions (ولكن لا يحمل الحرف '?'
والمتبوع بالحرف ')'
أي معنى خاص). يحدّد الحرف الأول بعد الحرف '?'
بنية الإضافة والمعنى الذي تحمله. ولا تنشئ الإضافات في العادة مجموعة جديدة باستثناء الملحق (?P<name>...)
. وفيما يلي قائمة بالإضافات المتوفّرة:
(?aiLmsux)
(حرف واحد أو أكثر من المجموعة 'a'
،'i'
،'L'
،'m'
،'s'
،'u'
،'x'
).
تطابق المجموعة السلسلة النصية الفارغة، أما الأحرف فتعيّن الراية المستخدمة في التعبير النمطي برمّته، وهي على النحو التالي:
re.A
(مطابقة الحروف بترميز ASCII فقط).
re.I
(تجاهل حالة الأحرف).re.L
(الاعتماد على الإعدادات المحلية).re.M
(متعددة الأسطر).re.S
(جعل النقطة تطابق كل شيء).re.U
(مطابقة الحروف بترميز Unicode).re.X
(تعابير نمطية منسقة).
(للتعرف على الرايات راجع قسم XXXXXXXX).
هذه الطريقة مفيدة إن كنت ترغب في تضمين الرايات في التعابير النمطية لتكون جزءًا منها، بدلًا من تمرير الراية كمعامل إلى الدالة re.compile()
. من الجدير بالذكر أنّه يجب استخدام الرايات أوّلًا في سلسلة التعبير النمطي.
(?:...)
هذا القيد مشابه للأقواس الاعتيادية حيث يطابق أي تعبير نمطي داخل الأقواس، ولكنّ لا يمكن استعادة السلسلة الفرعية المطابقة بواسطة المجموعة بعد إجراء عملية المطابقة ولا يمكن الإشارة إليها في التعابير النمطية.
(?imsx-imsx:...)
(صفر أو أكثر من الحروف في المجموعة 'i'
، 'm'
، 's'
، 'x'
، ويمكن أن يتبعها المحرف '-'
وهو أمر اختياري، ويتبعه حرف واحد أو أكثر من نفس المجموعة). تستخدم الحروف لتعيين أو إلغاء الرايات لجزء من التعبير النمطي، وهي على النحو التالي:
re.i
(تجاهل حالة الأحرف)
re.M
(متعدد الأسطر)
re.S
(النقطة تطابق كلّ شيء)
re.X
(تعابير نمطية منسقة).
ملاحظة: هذا القيد جديد في الإصدار 3.6 من اللغة.
(?P<name>...)
هذا القيد مشابه للأقواس الاعتيادية، ولكن يمكن الوصول إلى السلسلة الفرعية المطابقة عن طريق اسم المجموعة الرمزي name
. يجب أن تكون أسماء المجموعات معرّفات بايثون صالحة، ويجب تعريف كل اسم مجموعة مرة واحدة فقط ضمن التعبير النمطي. المجموعة الرمزي هي مجموعة مرقّمة أيضًا، كما لو كانت المجموعة لا تحمل أي اسم على الإطلاق.
يمكن الإشارة إلى المجموعات المسمّاة في ثلاثة سياقات. إن كان النمط هو ?P<quote>['"]).*?(?P=quote)
(أي يطابق سلسلة نصية محاطة بعلامات اقتباس أحادية أو ثنائية):
سياق الإشارة إلى المجموعة "quote" | طرق الإشارة إليها ضمن النمط نفسه |
---|---|
ضمن التعبير النمطي ذاته |
|
عند معالجة كائن التطابق |
|
في سلسلة نصية تُمرّر إلى المعامل repl في الدالة re.sub()
|
|
(?P=name)
إشارة راجعة إلى المجموعة المسماة، وتطابق أي نص جرت مطابقته بواسطة المجموعة المسمّاة name
في القيد السابق.
(?#...)
تستخدم هذه الصيغة لإضافة التعليقات، ويجري تجاهل المحتوى المحاط بالأقواس الهلالية.
(?=...)
يطابق هذا القيد إذا طابق التعبير النمطي الذي يلي علامة المساواة، ويسمّى هذا القيد بقيد التحقّق المسبق lookahead assertion. فعلى سبيل المثال يطابق التعبير Isaac (?=Asimov)
السلسلة النصية 'Isacc '
في حالة واحدة فقط وهي أن تكون الكلمة متبوعة بالعبارة 'Asimov'
.
(?!...)
يطابق هذا القيد إذا لم يطابق التعبير النمط الذي يلي علامة المساواة، ويسمّى هذا القيد بقيد التحقّق المسبق السلبي negative lookahead assertion. فعلى سبيل المثال يطابق التعبير Isaac(?!Asimov)
السلسلة 'Isaac '
في حالة واحدة فقط وهي أن لا تكون متبوعة بالعبارة 'Asmiov'
.
(?<=...)
يطابق هذا القيد إذا كان الموضع الحالي في السلسلة النصية مسبوقًا بحالة تطابق للتعبير النمطي الذي يلي علامة المساواة وتنتهي في الموقع الحالي. يسمّى هذا القيد بقيد التحقّق اللاحق الإيجابي (positive lookbehind assertion).
على سبيل المثال سيعثر التعبير (?<=abc)def
على حالة تطابق في السلسلة 'abcdef'
، لأنّ عملية التحقّق اللاحقة سترجع ثلاثة أحرف إلى الوراء وتتحقّق مما إذا كان النمط المعطى موجودًا في السلسلة النصية. يجب أن يطابق النمط المعطى سلاسل نصية ذات طول ثابت، وهذا يعني إمكانية استخدام تعابير مثل abc
أو a|b
، أما تعابير مثل a*
و a{3,4}
فغير مسموح بها.
يجب الانتباه إلى أنّ الأنماط التي تبدأ بقيد تحقّق لاحق إيجابي لن تطابق في بداية السلسلة النصية المعطاة، وفي مثل هذه الحالات يجب استخدام الدالة search()
عوضًا عن الدالة match()
:
>>> import re
>>> m = re.search('(?<=abc)def', 'abcdef')
>>> m.group(0) def'
في هذا المثال يجري البحث عن كلمة تتبع الواصلة hyphen:
>>> m = re.search(r'(?<=-)\w+', 'spam-egg')
>>> m.group(0) 'egg'
ملاحظة: أصبحت اللغة تدعم إشارات المجموعات ذات الطول الثابت منذ الإصدار 3.5 من اللغة.
(?<!...)
يطابق هذا القيد إن لم يكن الموضع الحالي في السلسلة النصية مسبوقًا بحالة تطابق للتعبير النمطي الذي يلي علامة المساواة وتنتهي في الموقع الحالي. يسمى هذا القيد بقيد التحقق اللاحق السلبي. وكما هو الحال في قيد التحقق اللاحق الإيجابي، يجب أن يكون النمط المعطى مطابقًا لسلاسل نصية ذات طول ثابت. يمكن للأنماط التي تبدأ بقيد تحقق لاحق سلبي أن تطابق في بداية السلسلة النصية المعطاة.
(?(id/name)yes-pattern|no-pattern)
يحاول هذا القيد أن يطابق النمط yes-pattern
إن كانت المجموعة ذات المعرّف id
او الاسم name
موجودة، وأن يطابق النمط no-pattern
إن كانت المجموعة غير موجودة. النمط no-pattern
هو نمط اختياري ويمكن حذفه من القيد. على سبيل المثال يمثّل التعبير (<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$)
تعبير مطابقة ضعيف لعناوين البريد الإلكتروني، حيث يطابق '<user@host.com>'
و 'user@host.com'
ولكنّه لا يطابق '<user@host.com'
ولا 'user@host.com>'
.
التسلسلات الخاصة
يتكوّن التسلسل الخاص من المحرف '\'
متبوعًا بأحد الأحرف الموجودة في القائمة أدناه. إن لم يكن الحرف الاعتيادي عددًا أو حرفًا ضمن الترميز ASCII فإنّ التعبير النمطي الناتج سيطابق الحرف الثاني. فمثلًا، يطابق التعبير \$
الحرف '$'
.
\number
يطابق محتويات المجموعة التي تحمل الرقم نفسه، ويبدأ ترقيم المجموعات من 1
. فعلى سبيل المثال يطابق التعبير (.+) \1
السلسلة النصية 'the the'
أو '55 55'
ولكنه لن يطابق 'thethe'
(لاحظ وجود فاصلة بيضاء بعد المجموعة). يمكن استخدام هذا التسلسل الخاص لمطابقة أول 99 مجموعة. إن كانت المرتبة الأولى من number
هي 0
، أو كان number
عددًا مكوّنًا من ثلاثة أعداد في النظام الثماني، فلن يُفسّر كتطابق للمجموعة، بل كحرف يمتلك قيمة number
في النظام الثماني. تعامل جميع عمليات تهريب الأعداد ضمن '['
و ']'
في فئات الحروف معاملة الأحرف.
\A
يطابق بداية السلسلة النصية فقط.
\b
يطابق السلسلة النصية الفارغة، ولكن في بداية أو نهاية الكلمة فقط، والكلمة هي تسلسل من الحروف. يمكن تعريف التسلسل \b
بأنّه الحدّ الفاصل بين حرف من التسلسل \w
و \W
(أو العكس)، أو بين التسلسل \w
وبداية أو نهاية السلسلة النصية. هذا يعني أنّ التعبير r'\bfoo\b'
يطابق كلًّا من 'foo'
و 'foo.'
و '(foo)'
و 'bar foo baz'
ولكن لا تطابق 'foobar'
أو 'foo3'
. تُستخدم حروف وأرقام الترميز Unicode بصورة افتراضية لإنشاء أنماط بهذا الترميز، ولكن يمكن تغيير الترميز باستخدام راية ASCII. تُعيّن حدود الكلمات باستخدام الإعدادات المحلية إن استُخدمت الراية LOCALE
. ولغرض التوافق مع السلاسل النصية في بايثون، فإنّ \b
تمثّل حرف المسافة الخلفية backspace ضمن مدًى من الحروف.
\B
يطابق هذا التسلسل السلسلة الفارغة ولكن عندما لا تكون في بداية الكلمة أو نهايتها. وهذا يعني أنّ النمط r'py\B'
يطابق كلًّا من 'python'
و 'py3'
و 'py2'
ولكن لا يطابق 'py'
ولا 'py.'
ولا 'py!'
. هذا التسلسل هو معكوس التسلسل \b
، لذا فإنّ الحروف في أنماط Unicode هي حروف وأرقام هذا الترميز أو الشرطة السفلية، ويمكن تغيير الترميز باستخدام الراية ASCII
. تُعيّن حدود الكلمة عن طريق الإعدادات المحلية إن جرى استخدام الراية LOCALE
.
\d
أنماط Unicode (السلاسل النصية): يطابق هذا التسلسل اخلاص أي عدد بترميز Unicode في النظام العشري (أي الحروف التي تندرج ضمن التصنيف [Nd]
في ترميز Unicode) وتشمل الأعداد [0-9]
إضافة إلى الأشكال الأخرى من الأعداد ضمن هذا الترميز. إن استخدمت الراية ASCII
فإنّ هذا التسلسل سيطابق الأعداد [0-9]
فقط (ولكن تطبيق الراية سيؤثّر على التعبير النمطي بأكمله، وفي مثل هذه الحالة يفضّل استخدام التعبير [0-9]
عوضًا عن هذا التسلسل).
أنماط 8-بت (البايتات): يطابق هذا التسلسل أي عدد في النظام العشري، وهذا يكافئ القيد [0-9]
.
\D
يطابق أي محرف لا يكون عددًا في النظام العشري، وهو التسلسل المعاكس للتسلسل \d
. وإن استُخدمت الراية ASCII
فإنّ هذا التسلسل يصبح مكافئًا للتعبير [^0-9]
. (ولكن تطبيق الراية سيؤثّر على التعبير النمطي بأكمله، وفي مثل هذه الحالة يفضّل استخدام التعبير [^0-9]
عوضًا عن هذا التسلسل).
\s
أنماط Unicode (السلاسل النصية): يطابق محرف المسافة البيضاء في ترميز Unicode (والتي تتضمن [ \t\n\r\f\v]
وغيرها الكثير من المحارف مثل المسافات غير المقطوعة non-breaking spaces والتي تكون إلزامية حسب قواعد الكتابة في بعض اللغات). إن استُخدمت الراية ASCII فإن التعبير [ \t\n\r\f\v]
هو الذي سيطابق فقط، (ولكن تطبيق الراية سيؤثّر على التعبير النمطي بأكمله، وفي مثل هذه الحالة يفضّل استخدام القيد [ \t\n\r\f\v]
عوضًا عن هذا التسلسل).
أنماط 8- بت (البايتات): تطابق المحارف التي تعدّ مسافات بيضاء في ترميز ASCII، وهذا يكافئ التعبير [ \t\n\r\f\v]
.
\S
يطابق أي محرف لا يعدّ محرف مسافة بيضاء، وهو التسلسل المعاكس للتسلسل \s
. إن استُخدمت الراية ASCII فإن هذا التسلسل يصبح مكافِئًا للتعبير [^ \t\n\r\f\v]
(ولكن تطبيق الراية سيؤثّر على التعبير النمطي بأكمله، وفي مثل هذه الحالة يفضّل استخدام القيد [^ \t\n\r\f\v]
عوضًا عن هذا التسلسل).
\w
أنماط Unicode (السلاسل النصية): يطابق محارف الكلمات في ترميز Unicode، وهذا يتضمّن معظم المحارف التي يمكن أن تكون جزءًا من كلمات اللغات المختلفة، إضافة إلى الأرقام والشرطة السفلية. إن استُخدمت الراية ASCII فإنّ التعبير [a-zA-Z0-9_] هو الذي سيطابق فقط (ولكن تطبيق الراية سيؤثّر على التعبير النمطي بأكمله، وفي مثل هذه الحالة يفضّل استخدام القيد [a-zA-Z0-9_] عوضًا عن هذا التسلسل).
أنماط 8-بت (البايتات): يطابق المحارف التي تعدّ أرقامًا وحروفًا في مجموعة محارف ASCII، وهذا مكافئ للتعبير [a-zA-Z0-9_]
. إن استخدمت الراية LOCALE
فإنّ هذا التسلسل الخاص يطابق المحارف التي تعدّ حروفًا وأرقامًا في الإعدادات المحلية الحالية إضافة إلى الشرطة السفلية.
\W
يطابق أي محرف لا يكون من محارف الكلمات، وهو التسلسل المعاكس للتسلسل \w
. إن استخدمت الراية ASCII فإنّ التسلسل يصبح مكافئًا للتعبير [^a-zA-Z0-9_]
(لكن تطبيق الراية سيؤثّر على التعبير النمطي بأكمله، وفي مثل هذه الحالة يفضّل استخدام القيد [^a-zA-Z0-9_]
عوضًا عن هذا التسلسل). إن استُخدمت الراية LOCALE
فإنّ التسلسل سيطابق المحارف التي تعدّ حروفًا وارقامًا في الإعدادات المحلية الحالية إضافة إلى الشرطة السفلية.
\Z
يطابق هذا التسلسل في نهاية السلسلة النصية فقط.
استخدام علامات التهريب القياسية في بايثون ضمن التعابير النمطية
يمكن استخدام معظم علامات التهريب القياسية المستخدمة في سلاسل بايثون النصية ضمن التعابير النمطية:
\a \b \f \n
\r \t \u \U
\v \x \\
(لاحظ أنّ \b
يستخدم لتمثيل حدود الكلمة، ويعني المسافة الخلفية backspace داخل فئات الحروف فقط). يتعرّف مفسّر التعبيرات النمطية على تسلسلي '\u'
و '\U'
في أنماط Unicode فقط، ولكنّها تعدّ أخطاءً في أنماط البايتات.
يمكن استخدام تسلسلات التهريب الثمانية ولكن ضمن نطاق ضيق، فإن كان العدد الأول هو 0
، أو كان هناك ثلاثة أعداد من النظام الثماني، فإنّ التسلسل يعدّ تسلسل تهريب ثماني، وباستثناء ما سبق فإنّه يعدّ إشارة مجموعة. وكما هو الحال مع تسلسلات التهريب في السلاسل النصية، فإنّ تسلسلات التهريب الثمانية يجب أن تتضمّن ثلاثة أعداد فقط.
ملاحظة: أضيف التسلسلان '\u'
و '\U'
في الإصدار 3.3 من اللغة.
ملاحظة: أصبحت التسلسلات المجهولة والتي تتضمن الحرف '\'
إلى جانب أحد حروف ASCII تعدّ أخطاءً في الإصدار 3.6 من اللغة.