English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دليل أساسي في Python

تحكم العمليات في Python

الوظائف في Python

أنواع البيانات في Python

عمليات ملفات Python

أوبجكتات وكلات Python

تاريخ وتوقيت Python

معرفة متقدمة في Python

دليل Python

التعبيرات العادية (RegEx) في Python

في هذا الدليل، ستتعلم تعبيرات النص النموذجية (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 عادي لتحديد النمط

لتحديد expression عادي، يتم استخدام characters meta. في المثال السابق، ^ و $ هي characters meta.

characters meta

characters meta هي characters التي يفسرها motor regex بشكل خاص. إليك قائمة meta characters:

[] . ^ $ * + ? {} () \ |

[] - brackets

brackets تعيين مجموعة characters التي ترغب في matchها.

表达式字符串匹配?
[abc]a1个匹配
ac2 مطابقات
Hey Jude没有匹配
abc de ca5 مطابقات

في هذا السياق، [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没有匹配
ac1个匹配
acd1个匹配
acde2 مطابقات (بما في ذلك 4 characters)

^- علامة الترقيم المزدوج

علامة الترقيم المزدوج ^ تستخدم للتحقق من whether a 字符串 starts مع a character.

表达式字符串匹配?
^aa1个匹配
abc1个匹配
bac没有匹配
^ababc1个匹配
acbلا توجد مطابقة (بتبدأ،a لكن ليس هناكb)

$- The dollar

The dollar sign $ is used to check if the stringwitha specific characterend.

表达式字符串匹配?
a$a1个匹配
formula1个匹配
cab没有匹配

*- The asterisk

The asterisk * matcheszero or moreremaining pattern.

表达式字符串匹配?
ma*nmn1个匹配
man1个匹配
maaan1个匹配
mainNo matches (a followed by no n)
woman1个匹配

+- The plus sign

The plus sign + matchesone or moreremaining pattern.

表达式字符串匹配?
ma+nmnNo matches (no a character)
man1个匹配
maaan1个匹配
mainNo matches (a followed by n)
woman1个匹配

?- The question mark

The question mark ? matcheszero or one occurrenceremaining pattern.

表达式字符串匹配?
ma?nmn1个匹配
man1个匹配
maaanNo matches (more than one a character)
mainNo matches (a followed by n)
woman1个匹配

{}- 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 daat1 match (at) daat
aabc daaat2 matches (locatedaabc and) daaat
aabc daaaat2 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}ab123csde1 match (matches at) ab123csde
12 and 3456732个匹配项(位于)12 and 345673
1 and 2没有匹配

|- the vertical bar

the vertical bar | is used for alternating display (or operator).

表达式字符串匹配?
a|bcde没有匹配
ade1 match (matches at)ade)
acdbea3个匹配项(位于)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)xzab xz没有匹配
abxz1 match (matches at) abxz
axz cabxz2个匹配项(位于)axzbc cabxz

\- الشقبة العكسية

الشقبة العكسية \ تستخدم لتشيف جميع الحروف بما في ذلك الحروف الخاصة. على سبيل المثال،

\$a إذا كان السلسلة تحتوي على $ تتبعه a، يتم التطابق. هنا، محرك التحقق من صحة النمط لا يعالجها بشكل خاص.

إذا كنت غير متأكد مما إذا كان الحرف يمتلك معنى خاص، يمكنك وضع \ أمام الحرف. هذا يضمن عدم معالجة الحرف بشكل خاص.

تسلسل خاص

تسلسل خاص يجعل الكتابة السهلة لمستويات النمط العادي. إليك قائمة بتسلسل الخاصيات:

\A -إذا كان الحرف المحدد في بداية السلسلة، يتم التطابق.

表达式字符串匹配?
\Athethe sun匹配
In the sun没有匹配

\b -إذا كان الحرف المحدد في بداية أو نهاية الكلمة، يتم التطابق.

表达式字符串匹配?
\bfoofootball匹配
a football匹配
afootball没有匹配
foo\bthe foo匹配
the afoo test匹配
the afootest没有匹配

\B-与\b。如果指定的字符不在单词的开头或结尾,则匹配。

表达式字符串匹配?
\Bfoofootball没有匹配
a football没有匹配
afootball匹配
foo\Bthe foo没有匹配
the afoo test没有匹配
the afootest匹配

\d-匹配任何十进制数字。相当于[0-9]

表达式字符串匹配?
\d12abc33个匹配项(位于)12abc3
Python没有匹配

\D-匹配任何非十进制数字。相当于[^0-9]

表达式字符串匹配?
\D1ab34"503个匹配项(位于)1ab34"50
1345没有匹配

\s-匹配字符串包含任何空格字符的地方。等同于[ \t\n\r\f\v]。

表达式字符串匹配?
\sPython RegEx1个匹配
PythonRegEx没有匹配

\S-匹配字符串包含任何非空白字符的地方。等同于[^ \t\n\r\f\v]。

表达式字符串匹配?
\Sa b2个匹配项(位于) a b
   没有匹配

\w-匹配任何字母数字字符(数字和字母)。等同于[a-zA-Z0-9_]。顺便说一下,下划线_也被认为是字母数字字符。

表达式字符串匹配?
\w12&": ;c3个匹配项(位于)12&": ;c
%"> !没有匹配

\W-匹配任何非字母数字字符。相当于[^a-zA-Z0-9_]

表达式字符串匹配?
\W1a2%c1个匹配(在)1a>>> match.start()%c
Python没有匹配

\Z -如果指定的字符在字符串的末尾,则匹配。

表达式字符串匹配?
\ZPythonI like Python1个匹配
I like Python没有匹配
Python is fun.没有匹配

提示:要构建和测试正则表达式,可以使用RegEx测试器工具,例如regex。该工具不仅可以帮助您创建正则表达式,还可以帮助您学习它。

现在,您了解了RegEx的基础知识,让我们讨论如何在Python代码中使用RegEx。

Python正则表达式

Python有一个名为re正则表达式的模块。要使用它,我们需要导入模块。

import re

该模块定义了一些可与RegEx一起使用的函数和常量。

re.findall()

re.findall()方法返回包含所有匹配项的字符串列表。

示例1: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() بإرجاع قائمة فارغة.

re.split()

تقوم طريقة split بتقسيم النص الم匹配 والعودة بقائمة النصوص التي تم تقسيمها.

مثال 2:re.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()

re.sub(pattern, replace, string)

يتم عودة طريقة هذه إلى نص يحتوي على استبدال الم匹配ات بالعنصر الموجود في المتغير replace.

مثال 3:re.sub()

# برنامج إزالة جميع الأماكن الفارغة
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.subn() يشبه re.sub()،ويتوقع أن يعود لهما مجموعة تحتوي على 2 عنصر،حيث يحتوي الأول على النص الجديد والعدد من الاستبدالات التي تم تنفيذها.

مثال 4: re.subn()

# برنامج إزالة جميع الأماكن الفارغة
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() اثنين من المعلمات: النمط والنص. تأخذ الطريقة هذا النمط من النص وتبحث عن المواقع الأولى التي تطابق النمط.

إذا كانت البحث ناجحًا، فإن re.search() يعود بكائن التطابق. وإذا لم يكن كذلك، فإنه يعود بلا شيء (None).

match = re.search(pattern, str)

مثال 5: re.search()

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()الحصول على طرق الكائن وأسواق الكائن.

بعض من الطرق الشائعة وأسواق الكائنات بعض الكائنات هي:

match.group()

يستعيد مكتبة group() الجزء من النص الذي تطابقه.

مثال 6: كائن التطابق

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()

('801', '35')

match.start()، match.end() و match.span()

الوظيفة start() تعود إلى بداية جزء المطابق. كما أن الوظيفة end() تعود إلى نهاية جزء المطابق.
>>> match.start()
2
>>> match.end()

8

الوظيفة span() تعود إلى زوج يحتوي على بداية و نهاية جزء المطابق.
>>> match.span()

(2, 8)

match.re و match.string

م匹配 العنصرre يعود إلى عنصر النمط النمطي. كما أن عنصر النصstring يعود إلى النص المرسل.
>>> match.re
>>> match.string
'39801 356, 2102 1111'

لقد قمنا بشرح جميع الطرق الشائعة المحددة في مكتبة re. إذا كنت ترغب في الحصول على معلومات إضافية، يرجى زيارةمكتبة re بايثون 3.

استخدام سلف الرموز قبل RegEx

إذا تم استخدامrأوRالسلف، سيتم تمثيله كنص مصدر.

الشيفرة المائلة\ تستخدم لتحويل مجموعة متنوعة من الأحرف بما في ذلك جميع الكاراكترات المتميزة. ولكن، باستخدامrالسلف \ سيجعله كحرف عادي.

مثال 7: استخدام سلف الرموز

import re
string = '\n and \r are escape sequences.'
result = re.findall(r'[\n\r]', string) 
print(result)
# مخرجات: ['\n', '\r']