التابع regex.sub()‎ في بايثون‎

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

يبدل التابع حالات التطابق غير المتداخلة في أقصى اليسار -والناتجة عن تطبيق التعبير النمطي المصرّف على السلسلة النصية المعطاة- بسلسلة نصية أو بالقيمة المعادة من دالة.

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

regex.sub(repl, string, count=0)

المعاملات

repl

يمكن للبديل repl أن يكون سلسلة نصية أو دالة، وإن كان سلسلة نصية، فإنّ التابع يعالج جميع المحارف المهرّبة فيها. بمعنى أنّ ‎\n تحوّل إلى محرف سطر جديد مفرد، و ‎\r تحوّل إلى حرف إرجاع، وهكذا. أما المحارف المجهولة مثل ‎\&‎ فتترك على حالها. وفي حال وجود إشارات خلفية مثل ‎\6‎K، فإنّ السلسلة النصية الفرعية المطابقة بواسطة المجموعة 6 في النمط ستحلّ محل السلسلة الأصلية.

عندما يكون المعامل repl سلسلة نصية، فبالإضافة إلى ما ورد أعلاه بخصوص محارف التهريب والإشارات الخلفية، فإنّ التسلسل ‎\g<name>‎ سيستخدم السلسلة النصية الفرعية المطابقة بواسطة المجموعة التي تحمل الاسم name، وعلى النحو المبيّن في صيغة (‎?P<name>...‎).

يستخدم التسلسل ‎\g<number>‎ عدد المجموعة المقابل، فمثلًا يكون التسلسل ‎\g<2>‎ مكافئًا للتسلسل ‎\2، ولن يتسبب هذا التسلسل بحدوث لبس في حالات مثل ‎\g<2>0، إذ قد يُفسّر التسلسل ‎\20 كإشارة إلى المجموعة 20 وليس كإشارة إلى المجموعة 2 متبوعة بالحرف '0'.

تستبدل الإشارة الخلفية ‎\g<0>‎ في كامل السلسلة الفرعية المطابقة للتعبير النمطي.

إن كان البديل repl دالّة، فإنّها تُستدعى عند كل حالة تطابق غير متداخلة. تأخذ الدالة معاملًا واحدًا وهو كائن match، وتعيد السلسلة النصية البديلة.

string

السلسلة النصية التي سيبحث فيها التابع عن حالات التطابق.

count

يعيّن المعامل الاختياري count الحد الأقصى لحالات التطابق التي سيجري استبدالها، ويجب أن يكون عددًا صحيحًا غير سالب. إن لم يأخذ هذا المعامل أيّ قيمة أو أخذ القيمة 0 فإنّ التابع سيستبدل جميع حالات التطابق.

تستبدل حالات التطابق الفارغة فقط عندما لا تكون مجاورة لحالة تطابق سابقة، لذا فإنّ الدالة sub('x*'‎, '-', 'abc')‎ تعيد السلسلة '-a-b-c-'.

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

يعيد التابع السلسلة النصية الناتجة من تبديل حالات التطابق غير المتداخلة في أقصى اليسار والناتجة عن تطبيق التعبير النمطي المصرّف على السلسلة النصية المعطاة، ليحل محلها البديل repl.

في حال عدم العثور على النمط المطلوب، يعيد التابع السلسلة النصية دون المساس بها.

أمثلة

تبيّن الأمثلة التالية طرق استخدام التابع regex.sub()‎:

1- في هذه المثال البديل repl هو سلسل نصية:

>>> import re
>>> p = re.compile(r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):')
>>> p.sub(r'static PyObject*\npy_\1(void)\n{', 'def myfunc():')
'static PyObject*\npy_myfunc(void)\n{'

أما في هذا المثال فالبديل هو دالة:

>>> import re
>>> def hexrepl(match):
...     "Return the hex string for a decimal number"
...     value = int(match.group())
...     return hex(value)
... 
>>> p = re.compile(r'\d+')
>>> p.sub(hexrepl, 'Call 65490 for printing, 49152 for user code.')
'Call 0xffd2 for printing, 0xc000 for user code.'


انظر أيضًا

  • الدالة re.sub() : تبدل الدالة حالات التطابق غير المتداخلة في أقصى اليسار -والناتجة عن تطبيق التعبير النمطي المعطى على السلسلة النصية المعطاة- بسلسلة نصية أو بالقيمة المعادة من دالة.
  • التابع regex.subn()‎: يؤدي هذا التابع نفس عمل التابع regex.sub()‎ ولكنّه يعيد الناتج على هيئة صفّ عناصره (السلسلة الجديدة، عدد الاستبدالات المجراة).

مصادر