English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا الدليل، ستتعلم تعبيرات النص النموذجية (RegEx) واستخدام مكتبة re في Python مع تعبيرات النص النموذجية (بمساعدة الأمثلة).
expression عادي (RegEx) هو سلسلة characters تعريف نمط البحث. على سبيل المثال،
^a...s$
التعليمات البرمجية أعلاه تعريف نمط RegEx. النمط هو:withaالمبدأة وبالتاليsالمكتوبرأي string من خمس letters..
يمكن استخدام النمط الذي تم تعريفه باستخدام RegEx للmatchCondition strings.
表达式 | 字符串 | 匹配? |
---|---|---|
^a...s$ | abs | 没有匹配 |
alias | 匹配 | |
abyss | 匹配 | |
Alias | 没有匹配 | |
An abacus | 没有匹配 |
يوجد module في Python يُدعى reRegEx. إليك مثال:
import re pattern = '^a...s$' test_string = 'abyss' result = re.match(pattern, test_string) if result: print("البحث ناجح.") else: print("البحث غير ناجح.")
في هذا السياق، نستخدم function re.match() للبحث عن النمط في string الاختبار. إذا كانت البحث ناجحًا، فإن هذا method سيعود object match. إذا لم يكن كذلك، فإنه سيعود None.
remodule تم تعريف بعض functions أخرى يمكن استخدامها مع RegEx. قبل ذلك، دعنا نتعلم expression عادي نفسه.
إذا كنت قد فهمت أساسيات RegEx، انتقل إلىPython RegEx.
لتحديد expression عادي، يتم استخدام characters meta. في المثال السابق، ^ و $ هي characters meta.
characters meta هي characters التي يفسرها motor regex بشكل خاص. إليك قائمة meta characters:
[] . ^ $ * + ? {} () \ |
[] - brackets
brackets تعيين مجموعة characters التي ترغب في matchها.
表达式 | 字符串 | 匹配? |
---|---|---|
[abc] | a | 1个匹配 |
ac | 2 مطابقات | |
Hey Jude | 没有匹配 | |
abc de ca | 5 مطابقات |
في هذا السياق، [abc] سيطابق، إذا كنت ترغب في match أي a،b أو c في a string.
يمكنك أيضًا استخدام range من characters داخل brackets.
[a-e] مشابه ل [abcde].
[1-4] مشابه ل [1234].
[0-39] مشابه ل [01239].
يمكنك استخدام ^ في بداية brackets لملء (عكس) مجموعة characters.
[^abc] يعني باستثناءaأوbأوcخارجمنأي character.
[^0-9] يعني أي character غير رقمي.
.- النقطة
النقطة match أي character الواحد (باستثناء 'newline' '\n').
表达式 | 字符串 | 匹配? |
---|---|---|
.. | a | 没有匹配 |
ac | 1个匹配 | |
acd | 1个匹配 | |
acde | 2 مطابقات (بما في ذلك 4 characters) |
^- علامة الترقيم المزدوج
علامة الترقيم المزدوج ^ تستخدم للتحقق من whether a 字符串 starts مع a character.
表达式 | 字符串 | 匹配? |
---|---|---|
^a | a | 1个匹配 |
abc | 1个匹配 | |
bac | 没有匹配 | |
^ab | abc | 1个匹配 |
acb | لا توجد مطابقة (بتبدأ،a لكن ليس هناكb) |
$- The dollar
The dollar sign $ is used to check if the stringwitha specific characterend.
表达式 | 字符串 | 匹配? |
---|---|---|
a$ | a | 1个匹配 |
formula | 1个匹配 | |
cab | 没有匹配 |
*- The asterisk
The asterisk * matcheszero or moreremaining pattern.
表达式 | 字符串 | 匹配? |
---|---|---|
ma*n | mn | 1个匹配 |
man | 1个匹配 | |
maaan | 1个匹配 | |
main | No matches (a followed by no n) | |
woman | 1个匹配 |
+- The plus sign
The plus sign + matchesone or moreremaining pattern.
表达式 | 字符串 | 匹配? |
---|---|---|
ma+n | mn | No matches (no a character) |
man | 1个匹配 | |
maaan | 1个匹配 | |
main | No matches (a followed by n) | |
woman | 1个匹配 |
?- The question mark
The question mark ? matcheszero or one occurrenceremaining pattern.
表达式 | 字符串 | 匹配? |
---|---|---|
ma?n | mn | 1个匹配 |
man | 1个匹配 | |
maaan | No matches (more than one a character) | |
main | No matches (a followed by n) | |
woman | 1个匹配 |
{}- curly braces
Consider the following code: {n,m}. This means that at leastn timesstyle, and at most repeatm timesstyle.
表达式 | 字符串 | 匹配? |
---|---|---|
a{2,3} | abc dat | 没有匹配 |
abc daat | 1 match (at) daat | |
aabc daaat | 2 matches (locatedaabc and) daaat | |
aabc daaaat | 2 matches (locatedaabc and) daaaat |
Let's try another example. RegEx [0-9]{2, 4} matches at least 2 digits but no more than 4
表达式 | 字符串 | 匹配? |
---|---|---|
[0-9]{2,4} | ab123csde | 1 match (matches at) ab123csde |
12 and 345673 | 2个匹配项(位于)12 and 345673 | |
1 and 2 | 没有匹配 |
|- the vertical bar
the vertical bar | is used for alternating display (or operator).
表达式 | 字符串 | 匹配? |
---|---|---|
a|b | cde | 没有匹配 |
ade | 1 match (matches at)ade) | |
acdbea | 3个匹配项(位于)acdbea |
In this case, a|b matches any thataأوb's字符串
()- parentheses
parentheses () are used to group subpatterns. For example, (a|b|c)xz matches any thataأوbأوcmatches and followed byxz's字符串
表达式 | 字符串 | 匹配? |
---|---|---|
(a|b|c)xz | ab xz | 没有匹配 |
abxz | 1 match (matches at) abxz | |
axz cabxz | 2个匹配项(位于)axzbc cabxz |
\- الشقبة العكسية
الشقبة العكسية \ تستخدم لتشيف جميع الحروف بما في ذلك الحروف الخاصة. على سبيل المثال،
\$a إذا كان السلسلة تحتوي على $ تتبعه a، يتم التطابق. هنا، محرك التحقق من صحة النمط لا يعالجها بشكل خاص.
إذا كنت غير متأكد مما إذا كان الحرف يمتلك معنى خاص، يمكنك وضع \ أمام الحرف. هذا يضمن عدم معالجة الحرف بشكل خاص.
تسلسل خاص
تسلسل خاص يجعل الكتابة السهلة لمستويات النمط العادي. إليك قائمة بتسلسل الخاصيات:
\A -إذا كان الحرف المحدد في بداية السلسلة، يتم التطابق.
表达式 | 字符串 | 匹配? |
---|---|---|
\Athe | the sun | 匹配 |
In the sun | 没有匹配 |
\b -إذا كان الحرف المحدد في بداية أو نهاية الكلمة، يتم التطابق.
表达式 | 字符串 | 匹配? |
---|---|---|
\bfoo | football | 匹配 |
a football | 匹配 | |
afootball | 没有匹配 | |
foo\b | the foo | 匹配 |
the afoo test | 匹配 | |
the afootest | 没有匹配 |
\B-与\b。如果指定的字符不在单词的开头或结尾,则匹配。
表达式 | 字符串 | 匹配? |
---|---|---|
\Bfoo | football | 没有匹配 |
a football | 没有匹配 | |
afootball | 匹配 | |
foo\B | the foo | 没有匹配 |
the afoo test | 没有匹配 | |
the afootest | 匹配 |
\d-匹配任何十进制数字。相当于[0-9]
表达式 | 字符串 | 匹配? |
---|---|---|
\d | 12abc3 | 3个匹配项(位于)12abc3 |
Python | 没有匹配 |
\D-匹配任何非十进制数字。相当于[^0-9]
表达式 | 字符串 | 匹配? |
---|---|---|
\D | 1ab34"50 | 3个匹配项(位于)1ab34"50 |
1345 | 没有匹配 |
\s-匹配字符串包含任何空格字符的地方。等同于[ \t\n\r\f\v]。
表达式 | 字符串 | 匹配? |
---|---|---|
\s | Python RegEx | 1个匹配 |
PythonRegEx | 没有匹配 |
\S-匹配字符串包含任何非空白字符的地方。等同于[^ \t\n\r\f\v]。
表达式 | 字符串 | 匹配? |
---|---|---|
\S | a b | 2个匹配项(位于) a b |
没有匹配 |
\w-匹配任何字母数字字符(数字和字母)。等同于[a-zA-Z0-9_]。顺便说一下,下划线_也被认为是字母数字字符。
表达式 | 字符串 | 匹配? |
---|---|---|
\w | 12&": ;c | 3个匹配项(位于)12&": ;c |
%"> ! | 没有匹配 |
\W-匹配任何非字母数字字符。相当于[^a-zA-Z0-9_]
表达式 | 字符串 | 匹配? |
---|---|---|
\W | 1a2%c | 1个匹配(在)1a>>> match.start()%c |
Python | 没有匹配 |
\Z -如果指定的字符在字符串的末尾,则匹配。
表达式 | 字符串 | 匹配? |
---|---|---|
\ZPython | I like Python | 1个匹配 |
I like Python | 没有匹配 | |
Python is fun. | 没有匹配 |
提示:要构建和测试正则表达式,可以使用RegEx测试器工具,例如regex。该工具不仅可以帮助您创建正则表达式,还可以帮助您学习它。
现在,您了解了RegEx的基础知识,让我们讨论如何在Python代码中使用RegEx。
Python有一个名为re正则表达式的模块。要使用它,我们需要导入模块。
import re
该模块定义了一些可与RegEx一起使用的函数和常量。
re.findall()方法返回包含所有匹配项的字符串列表。
# 从字符串中提取数字的程序 import re string = 'hello 12 hi 89. Howdy 34' pattern = '\d+' result = re.findall(pattern, string) print(result) # الإخراج: ['12', '89', '34']
إذا لم يتم العثور على هذا النمط،فسيقوم re.findall() بإرجاع قائمة فارغة.
تقوم طريقة split بتقسيم النص الم匹配 والعودة بقائمة النصوص التي تم تقسيمها.
import re string = 'Twelve:12 Eighty nine:89.' pattern = '\d+' result = re.split(pattern, string) print(result) # الإخراج: ['Twelve:', ' Eighty nine:', '.']
إذا لم يتم العثور على هذا النمط،فسيقوم re.split() بإرجاع قائمة تحتوي على نص فارغ.
يمكنك تمرير معامل maxsplit إلى طريقة re.split().هذا هو عدد التقسيمات التي ستحدث.
import re string = 'Twelve:12 Eighty nine:89 Nine:9.' pattern = '\d+' # maxsplit = 1 # تقسيم فقط عند الظهور الأول result = re.split(pattern, string, 1) print(result) # الإخراج: ['Twelve:', ' Eighty nine:89 Nine:9.']
بالمناسبة،قيمة الافتراضية لـ maxsplit هي 0؛القيمة الافتراضية هي 0.ما يعنيه ذلك هو تقسيم جميع النتائج التي تتطابق مع النمط.
نصب re.sub()
re.sub(pattern, replace, string)
يتم عودة طريقة هذه إلى نص يحتوي على استبدال الم匹配ات بالعنصر الموجود في المتغير replace.
# برنامج إزالة جميع الأماكن الفارغة import re # نص متعدد الأسطر string = 'abc 12\ de 23 f45 6' # تطابق جميع الأماكن الفارغة pattern = '\s+' # خلاصة replace = '' new_string = re.sub(pattern, replace, string) print(new_string) # الإخراج: abc12de23f456
إذا لم يتم العثور على هذا النمط،فسيقوم re.sub() بإرجاع النص الأصلي.
يمكنك تمريرcountيتم نقل الرقم الرابع كمعامل إلى طريقة re.sub() هذه.إذا تم تمريره بلا قيمة،فسيكون الناتج 0.وسيتم استبدال جميع الم匹配ات.
import re # نص متعدد الأسطر string = 'abc 12\ de 23 f45 6' # تطابق جميع الأماكن الفارغة pattern = '\s+' replace = '' new_string = re.sub(r'\s+', replace, string, 1) print(new_string) # الإخراج: # abc12de 23 # f45 6
re.subn() يشبه re.sub()،ويتوقع أن يعود لهما مجموعة تحتوي على 2 عنصر،حيث يحتوي الأول على النص الجديد والعدد من الاستبدالات التي تم تنفيذها.
# برنامج إزالة جميع الأماكن الفارغة import re # نص متعدد الأسطر string = 'abc 12\ de 23 f45 6' # تطابق جميع الأماكن الفارغة pattern = '\s+' # خلاصة replace = '' new_string = re.subn(pattern, replace, string) print(new_string) # خروج: ('abc12de23f456', 4)
يستخدم طريقة re.search() اثنين من المعلمات: النمط والنص. تأخذ الطريقة هذا النمط من النص وتبحث عن المواقع الأولى التي تطابق النمط.
إذا كانت البحث ناجحًا، فإن re.search() يعود بكائن التطابق. وإذا لم يكن كذلك، فإنه يعود بلا شيء (None).
match = re.search(pattern, str)
import re string = "Python is fun" # التحقق مما إذا كان "Python" في البداية match = re.search('\APython', string) if match: print("pattern found inside the string") else: print("pattern not found") # خروج: pattern found inside the string
في هذا المكان،matchيحتوي على كائن match.
يمكنك استخدامdir()الحصول على طرق الكائن وأسواق الكائن.
بعض من الطرق الشائعة وأسواق الكائنات بعض الكائنات هي:
يستعيد مكتبة group() الجزء من النص الذي تطابقه.
import re string = '39801 356, 2102 1111' # ثلاثة أرقام، ثم مسافة، واثنان من الأرقام pattern = '(\d{3}) (\d{2})' # متغير match يحتوي على كائن Match. match = re.search(pattern, string) if match: print(match.group()) else: print("pattern not found") # خروج: 801 35
في هذا المكان،matchالمعلمة تحتوي على كائن match.
نموذجنا (\d{3}) (\d{2}) يحتوي على مجموعتين فرعيتين (\d{3}) و(\d{2}). يمكنك الحصول على جزء من النص الموجود داخل الأقواس. هكذا:
>>> match.group(1) >>> match.group(1) '801' >>> match.group(2) '35' >>> match.groups() >>> match.group(1, 2) >>> match.groups()
match.start()، match.end() و match.span()
الوظيفة start() تعود إلى بداية جزء المطابق. كما أن الوظيفة end() تعود إلى نهاية جزء المطابق. >>> match.start() 2 >>> match.end()
8
الوظيفة span() تعود إلى زوج يحتوي على بداية و نهاية جزء المطابق. >>> match.span()
match.re و match.string
م匹配 العنصرre يعود إلى عنصر النمط النمطي. كما أن عنصر النصstring يعود إلى النص المرسل. >>> match.re >>> match.string '39801 356, 2102 1111'
لقد قمنا بشرح جميع الطرق الشائعة المحددة في مكتبة re. إذا كنت ترغب في الحصول على معلومات إضافية، يرجى زيارةمكتبة re بايثون 3.
إذا تم استخدامrأوRالسلف، سيتم تمثيله كنص مصدر.
الشيفرة المائلة\ تستخدم لتحويل مجموعة متنوعة من الأحرف بما في ذلك جميع الكاراكترات المتميزة. ولكن، باستخدامrالسلف \ سيجعله كحرف عادي.
import re string = '\n and \r are escape sequences.' result = re.findall(r'[\n\r]', string) print(result) # مخرجات: ['\n', '\r']