re --- التعبيرات النمطية البسيطة

تنفّذ هذه الوحدة عمليات التعبيرات النمطية. صياغة التعبيرات النمطية المدعومة هي مجموعة فرعية من وحدة re في CPython (وهي في الواقع مجموعة فرعية من التعبيرات النمطية الممتدة لمعيار POSIX).

المعاملات والتسلسلات الخاصة المدعومة هي:

.

تطابق أي محرف.

[...]

تطابق مجموعة من المحارف. تُدعم المحارف المفردة والنطاقات، بما في ذلك المجموعات المنفية (على سبيل المثال [^a-c]).

^

تطابق بداية السلسلة النصية.

$

تطابق نهاية السلسلة النصية.

?

تطابق صفرًا أو واحدًا من النمط الفرعي السابق.

*

تطابق صفرًا أو أكثر من النمط الفرعي السابق.

+

تطابق واحدًا أو أكثر من النمط الفرعي السابق.

??

النسخة غير الجشعة من ?، تطابق صفرًا أو واحدًا، مع تفضيل الصفر.

*?

النسخة غير الجشعة من *، تطابق صفرًا أو أكثر، مع تفضيل أقصر تطابق.

+?

النسخة غير الجشعة من +، تطابق واحدًا أو أكثر، مع تفضيل أقصر تطابق.

|

تطابق إما النمط الفرعي على الجانب الأيسر أو النمط الفرعي على الجانب الأيمن من هذا المعامل.

(...)

التجميع. كل مجموعة تكون مُلتقِطة (يمكن الوصول إلى السلسلة الفرعية التي تلتقطها باستخدام طريقة match.group()).

(?:...)

تجميع غير ملتقِط. تُطابَق كل مجموعة باستخدام نفس قواعد التجميع العادي، لكنها لن تكون جزءًا من كائن التطابق.

\d

تطابق رقمًا. مكافئة لـ [0-9].

\D

تطابق ما ليس رقمًا. مكافئة لـ [^0-9].

\s

تطابق المسافات البيضاء. مكافئة لـ [ \t-\r].

\S

تطابق ما ليس مسافة بيضاء. مكافئة لـ [^ \t-\r].

\w

تطابق "محارف الكلمات" (ASCII فقط). مكافئة لـ [A-Za-z0-9_].

\W

تطابق ما ليس من "محارف الكلمات" (ASCII فقط). مكافئة لـ [^A-Za-z0-9_].

\

محرف الهروب. أي محرف آخر يتبع الشرطة المائلة العكسية، باستثناء تلك المذكورة أعلاه، يُؤخذ حرفيًا. على سبيل المثال، \* مكافئة للمحرف الحرفي * (لا تُعامَل بوصفها المعامل *). لاحظ أن \r و \n وما إلى ذلك لا تُعالَج بصورة خاصة، وستكون مكافئة للحروف الحرفية r و n وما إلى ذلك. ولهذا السبب، لا يُنصَح باستخدام سلاسل Python الخام (r"") للتعبيرات النمطية. على سبيل المثال، r"\r\n" عند استخدامها بوصفها تعبيرًا نمطيًا تكون مكافئة لـ "rn". لمطابقة محرف CR متبوعًا بـ LF، استخدم "\r\n".

غير مدعوم:

  • التكرارات المعدودة ({m,n})

  • المجموعات المسماة ((?P<name>...))

  • التأكيدات الأكثر تقدمًا (\b و \B)

  • هروب المحارف الخاصة مثل \r و \n - استخدم آلية الهروب الخاصة بـ Python بدلًا من ذلك

  • إلخ.

مثال:

import re

# As re doesn't support escapes itself, use of r"" strings is not
# recommended.
regex = re.compile("[\r\n]")

regex.split("line1\rline2\nline3\r\n")

# Result:
# ['line1', 'line2', 'line3', '', '']

الدوال

re.compile(regex_str: str, flags: int = 0) 'regex'

تُجمِّع التعبير النمطي، وتُرجِع كائن regex.

re.search(regex_str: str, string: str) 'match | None'

تُجمِّع regex_str وتبحث عنه في string. على عكس match، تبحث هذه الدالة في السلسلة النصية عن أول موضع يطابق التعبير النمطي (والذي قد يظل 0 إذا كان التعبير النمطي مثبتًا).

re.sub(regex_str: str, replace: str | Callable, string: str, count: int = 0, flags: int = 0, /) str

تُجمِّع regex_str وتبحث عنه في string، مستبدلةً جميع التطابقات بـ replace، وتُرجِع السلسلة النصية الجديدة.

يمكن أن يكون replace سلسلة نصية أو دالة. إذا كان سلسلة نصية فيمكن استخدام تسلسلات الهروب من الشكل \<number> و \g<number> للتوسع إلى المجموعة المقابلة (أو سلسلة نصية فارغة للمجموعات غير المتطابقة). إذا كان replace دالة فيجب أن تأخذ وسيطًا واحدًا (التطابق) وأن تُرجِع سلسلة نصية بديلة.

إذا تم تحديد count وكان غير صفري، فإن الاستبدال سيتوقف بعد إجراء هذا العدد من الاستبدالات. يُتجاهَل الوسيط flags.

كائنات Regex

تعبير نمطي مُجمَّع. تُنشَأ نُسَخ هذه الفئة باستخدام re.compile().

class re.regex

كائن التعبير النمطي المُجمَّع الذي تُرجِعه re.compile().

match(string: str, pos: int = 0, endpos: int | None = None) 'match | None'

يطبّق هذا التعبير النمطي المُجمَّع على string، مثبتًا عند بداية منطقة البحث، ويُرجِع كائن match، أو None إذا لم يطابق التعبير النمطي. هذا هو المكافئ للنمط المُجمَّع للفئة على مستوى الوحدة match، وهو أكثر كفاءة بكثير عند تطبيق نفس النمط على سلاسل نصية متعددة.

يعطي المعامل الاختياري pos فهرسًا في string حيث يبدأ البحث؛ وقيمته الافتراضية 0. هذا ليس مكافئًا تمامًا لتقطيع السلسلة النصية؛ فمحرف النمط '^' يطابق عند البداية الحقيقية للسلسلة النصية وعند المواضع التي تلي مباشرة سطرًا جديدًا، لكن ليس بالضرورة عند الفهرس الذي يبدأ البحث منه.

يحدّ المعامل الاختياري endpos من مدى البحث في string؛ سيكون الأمر كما لو أن السلسلة النصية بطول endpos من المحارف، فلا يُبحَث إلا في المحارف من pos إلى endpos - 1. إذا كان endpos هو None (القيمة الافتراضية) فإن البحث يجري في السلسلة النصية بأكملها.

search(string: str, pos: int = 0, endpos: int | None = None) 'match | None'

يمسح string بحثًا عن أول موضع يُنتِج فيه هذا التعبير النمطي المُجمَّع تطابقًا، ويُرجِع كائن match، أو None إذا لم يطابق أي موضع. هذا هو المكافئ للنمط المُجمَّع لدالة search() على مستوى الوحدة، وهو أكثر كفاءة بكثير عند تطبيق نفس النمط على سلاسل نصية متعددة.

يعطي المعامل الاختياري pos فهرسًا في string حيث يبدأ البحث؛ وقيمته الافتراضية 0. هذا ليس مكافئًا تمامًا لتقطيع السلسلة النصية؛ فمحرف النمط '^' يطابق عند البداية الحقيقية للسلسلة النصية وعند المواضع التي تلي مباشرة سطرًا جديدًا، لكن ليس بالضرورة عند الفهرس الذي يبدأ البحث منه.

يحدّ المعامل الاختياري endpos من مدى البحث في string؛ سيكون الأمر كما لو أن السلسلة النصية بطول endpos من المحارف، فلا يُبحَث إلا في المحارف من pos إلى endpos - 1. إذا كان endpos هو None (القيمة الافتراضية) فإن البحث يجري في السلسلة النصية بأكملها.

sub(replace: str | Callable, string: str, count: int = 0, flags: int = 0, /) str

يبحث عن هذا التعبير النمطي المُجمَّع في string، مستبدلًا جميع التطابقات بـ replace، ويُرجِع السلسلة النصية الجديدة. هذا هو المكافئ للنمط المُجمَّع لدالة sub() على مستوى الوحدة، وهو أكثر كفاءة بكثير عند تطبيق نفس النمط على سلاسل نصية متعددة.

يمكن أن يكون replace سلسلة نصية أو دالة. إذا كان سلسلة نصية فيمكن استخدام تسلسلات الهروب من الشكل \<number> و \g<number> للتوسع إلى المجموعة المقابلة (أو سلسلة نصية فارغة للمجموعات غير المتطابقة). إذا كان replace دالة فيجب أن تأخذ وسيطًا واحدًا (التطابق) وأن تُرجِع سلسلة نصية بديلة.

إذا تم تحديد count وكان غير صفري، فإن الاستبدال سيتوقف بعد إجراء هذا العدد من الاستبدالات. يُتجاهَل الوسيط flags.

split(string: str, max_split: int = -1, /) List[str]

يقسّم string باستخدام تعبير نمطي. إذا تم إعطاء max_split، فإنه يحدد العدد الأقصى لعمليات التقسيم المراد تنفيذها. يُرجِع قائمة من السلاسل النصية (قد يصل عدد العناصر إلى max_split+1 إذا تم تحديده).

كائنات التطابق

يحمل كائن التطابق نتيجة عملية مطابقة ناجحة.

class re.match(regex_str: str, string: str)

يطابق regex_str مع string، مثبتًا عند بداية السلسلة النصية، ويُرجِع كائن تطابق، أو None إذا لم يطابق. هذا هو الاختصار على مستوى الوحدة: re.match(regex_str, string) مكافئة لـ re.compile(regex_str).match(string).

يُرجَع كائن التطابق نفسه أيضًا بواسطة search()، وبواسطة طريقتي النمط المُجمَّع regex.match() / regex.search()، ويُمرَّر إلى دالة الاستبدال المستخدمة بواسطة sub().

group(index: int) str

يُرجِع السلسلة (الفرعية) المتطابقة. index هو 0 للتطابق بأكمله، و1 وما فوق لكل مجموعة ملتقِطة. تُدعم المجموعات الرقمية فقط.