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.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.
كائنات التطابق¶
يحمل كائن التطابق نتيجة عملية مطابقة ناجحة.
- 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().