وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

مقدمه ای بر عبارات منظم در پایتون

0 12
زمان لازم برای مطالعه: 7 دقیقه


در این آموزش قصد داریم با استفاده از عبارات منظم در پایتون، از جمله سینتکس آنها، و روش ساخت آنها با استفاده از ماژول های داخلی پایتون آشنا شویم. برای انجام این کار، عملیات های مختلف در پایتون را پوشش می دهیم ماژول مجددو روش استفاده از آن در برنامه های پایتون.

عبارات منظم چیست؟

عبارات منظم اساساً فقط دنباله ای از کاراکترها هستند که می توانند برای تعریف الگوی جستجو برای یافتن متن استفاده شوند. این “موتور جستجو” در زبان برنامه نویسی پایتون (و همچنین بسیاری از زبان های دیگر) تعبیه شده است و از طریق re مدول.

برای استفاده از عبارات منظم (یا به اختصار “regex”) معمولاً قوانینی را برای مجموعه رشته های احتمالی که می خواهید مطابقت داشته باشند مشخص می کنید و سپس از خود سؤالاتی مانند “آیا این رشته با الگو مطابقت دارد؟” یا “آیا وجود دارد؟” با الگوی هر جایی از این رشته مطابقت دارد؟”

همچنین می توانید از regexes برای تغییر رشته یا جدا کردن آن به روش های مختلف استفاده کنید. این عملیات «ترتیب بالاتر» همگی با تطبیق متن با رشته regex شروع می‌شوند، و سپس رشته را می‌توان دستکاری کرد (مانند تقسیم شدن) پس از یافتن مطابقت. همه اینها توسط re ماژول موجود در پایتون، که در بخش‌های بعدی بیشتر به آن خواهیم پرداخت.

نحو بیان منظم

یک عبارت منظم الگویی را مشخص می کند که هدف آن مطابقت با رشته ورودی است. در این بخش، برخی از کاراکترها و الگوهای خاصی را که می توانید برای مطابقت با رشته ها استفاده کنید، نشان خواهیم داد.

تطبیق شخصیت ها

عبارات منظم می توانند شامل کاراکترهای خاص و معمولی باشند. بیشتر کاراکترهای معمولی، مانند «A»، «a» یا «0» ساده‌ترین عبارات منظم هستند. آنها به سادگی خود را مطابقت می دهند. کاراکترهای ویژه دیگری نیز وجود دارند که نمی توانند با خودشان مطابقت داشته باشند، به عنوان مثال ^، $، *، +، ?، {، }، (، )، \، |، (، و ). این به این دلیل است که آنها برای عملکرد تطبیق مرتبه بالاتر استفاده می شوند که در این جدول بیشتر توضیح داده شده است:

متاکاراکتر شرح
* با عنصر قبلی مطابقت دارد صفر یا چند بار مثلا، ab*c مطابق با “ac”، “abc”، “abbbc”، و غیره. (xyz)* منطبق بر “”، “x”، “y”، “z”، “zx”، “zyx”، “xyzzy”، و غیره روی. (ab)* منطبق بر «»، «اب»، «اباب»، «اباباب» و غیره روی.
+ با عنصر قبلی مطابقت دارد یکی یا چند بار مثلا، ab+c با “abc”، “abbc”، “abbbc” و غیره مطابقت دارد روی، اما نه “ac”.
? با عنصر قبلی صفر یا یک زمان مطابقت دارد. مثلا، ab؟c فقط با “ac” یا “abc” مطابقت دارد.
| عملگر انتخاب (همچنین به عنوان تناوب یا اتحاد مجموعه نیز شناخته می شود) با عبارت قبل یا عبارت بعد از این عملگر مطابقت دارد. مثلا، abc|def می تواند با “abc” یا “def” مطابقت داشته باشد.
. با هر کاراکتری منطبق است (بسیاری از برنامه‌ها خطوط جدید را حذف می‌کنند و دقیقاً کدام نویسه‌ها به عنوان خطوط جدید در نظر گرفته می‌شوند مربوط به طعم، رمزگذاری کاراکتر و پلتفرم خاص است، اما می‌توان فرض کرد که کاراکتر فید خط گنجانده شده است). در عبارات براکت POSIX، کاراکتر نقطه با یک نقطه تحت اللفظی مطابقت دارد. مثلا، a.c منطبق بر “abc”، و غیره، اما (a.c) فقط با “a”، “.”، یا “c” مطابقت دارد.
^ مطابقت دارد راه افتادن موقعیت در رشته، مانند startsWith() تابع. در ابزارهای مبتنی بر خط، با موقعیت شروع هر خط مطابقت دارد.
? مطابقت دارد پایان یافتن موقعیت رشته یا موقعیت درست قبل از یک خط جدید با پایان رشته، مانند endsWith() تابع. در ابزارهای مبتنی بر خط، با موقعیت پایانی هر خط مطابقت دارد.

برای برخی از توضیحات regex به ویکی‌پدیا اعتبار داده می‌شود.

روش های عبارات منظم در پایتون

چندین روش برای استفاده از عبارات منظم وجود دارد. در اینجا قصد داریم به برخی از متداول ترین روش ها و همچنین چند مثال از روش استفاده از آنها بپردازیم. این روش ها عبارتند از:

  1. re.match()
  2. پژوهش()
  3. re.findall()
  4. re.split()
  5. re.sub()
  6. re.compile()

re.match (الگو، رشته، پرچم = 0)

این عبارت برای تطبیق یک کاراکتر یا مجموعه ای از کاراکترها به کار می رود شروع از یک رشته همچنین مهم است که توجه داشته باشید که اگر رشته داده شده دارای چندین خط باشد، این عبارت فقط در ابتدای رشته مطابقت دارد و نه در ابتدای هر خط.

عبارت زیر باز خواهد گشت None زیرا پایتون در ابتدای رشته ظاهر نمی شود.



import re
result = re.match(r'Python', 'It\'s  easy to learn Python. Python also has elegant syntax')

print(result)
$ python match.py
None

جستجوی مجدد (الگو، رشته)

این ماژول مطابقت را بررسی می کند هر جا در رشته داده شده و در صورت یافتن نتایج را برمی گرداند و None اگر پیدا نشد

در کد زیر به سادگی می‌خواهیم پیدا کنیم که آیا کلمه “توله سگ” در رشته “Daisy found a puppy” وجود دارد یا خیر.



import re

if re.search("puppy", "Daisy found a puppy."):
    print("Puppy found")
else:
    print("No puppy")

اینجا ما اول import را re ماژول و استفاده از آن برای جستجوی وقوع زیر رشته “توله سگ” در رشته “Daisy found a puppy”. اگر در رشته وجود داشته باشد، a re.MatchObject برگردانده می‌شود، که وقتی در یک بیانیه اگر ارزیابی می‌شود، «حقیقت» در نظر گرفته می‌شود.

$ python search.py 
Puppy found

re.compile(الگو، پرچم=0)

از این روش برای کامپایل یک الگوی عبارت منظم در یک شیء عبارت منظم استفاده می شود که می تواند برای تطبیق با استفاده از آن استفاده شود match() و search() روش هایی که در بالا به آنها اشاره کردیم. این همچنین می تواند باعث صرفه جویی در زمان شود، زیرا تجزیه / مدیریت رشته های regex می تواند از نظر محاسباتی گران باشد.



import re

pattern = re.compile('Python')
result = pattern.findall('Pythonistas are programmers that use Python, which is an easy-to-learn and powerful language.')

print(result)

find = pattern.findall('Python is easy to learn')

print(find)
$ python compile.py 
('Python', 'Python')
('Python')

توجه داشته باشید که فقط رشته منطبق برگردانده می شود، برخلاف کل کلمه در مورد “Pythonistas”. این هنگام استفاده از یک رشته regex که دارای کاراکترهای تطبیق خاصی در آن است مفیدتر است.

re.sub (الگو، repl، رشته)

همانطور که از نام آن پیداست، این عبارت برای جستجو و جایگزینی رشته جدید در صورت وجود الگو استفاده می شود.



import re
result = re.sub(r'python', 'ruby', 'python is a very easy language')

print(result)
$ python sub.py 
ruby is a very easy language

re.findall (الگو، رشته)

همانطور که قبل از این بخش مشاهده کردید، این روش لیستی از تمام رخدادها را در رشته داده شده پیدا کرده و بازیابی می کند. این هر دو عملکرد و ویژگی های را ترکیب می کند re.search() و re.match(). مثال زیر تمام رخدادهای “Python” را از رشته بازیابی می کند.



import re

result = re.findall(r'Python', 'Python is an easy to learn, powerful programming language. Python also has elegant syntax')
print(result)
$ python findall.py 
('Python', 'Python')

باز هم، استفاده از یک رشته تطبیق دقیق مانند این (“Python”) واقعاً فقط برای یافتن اینکه آیا رشته regex در رشته داده شده رخ می دهد یا چند بار استفاده می شود مفید است.

re.split(الگو، رشته، maxsplit=0، flags=0)

این عبارت یک رشته را در محلی که الگوی مشخص شده در رشته قرار دارد تقسیم می کند. همچنین در صورت داشتن ویژگی پیشرفته، متن تمام گروه‌های موجود در الگو را برمی‌گرداند گرفتن پرانتز در الگو استفاده می شود.



import re

result =  re.split(r"y", "Daisy found a puppy")

if result:
    print(result)
else:
   print("No puppy")

همانطور که در بالا می بینید، الگوی کاراکتر “y” سه بار رخ می دهد و عبارت در همه مواردی که رخ می دهد تقسیم شده است.

$ python split.py 
('Dais', ' found a pupp', '')

کاربردهای عملی عبارات منظم

چه بدانید چه ندانید، ما تقریباً هر روز از عبارات منظم در برنامه های خود استفاده می کنیم. از آنجایی که عبارات منظم تقریباً در هر زبان برنامه نویسی موجود است، فرار از استفاده آنها آسان نیست. بیایید به برخی از روش هایی که می توان از عبارات منظم در برنامه های شما استفاده کرد نگاهی بیندازیم.

ساخت URL

هر وب page URL دارد. حالا تصور کنید که یک وب سایت جنگو با آدرسی مانند ” داریدhttp://www.example.com/products/27/“، که در آن 27 شناسه یک محصول است. نوشتن نماهای جداگانه برای مطابقت با هر محصول بسیار دشوار است.

با این حال، با عبارات منظم، می‌توانیم الگویی ایجاد کنیم که با URL مطابقت داشته باشد و شناسه را برای ما استخراج کنیم:

عبارتی که با هر شناسه عددی مطابقت و استخراج می‌کند ^products/(\d+)/$.

  • ^products/ به جنگو می‌گوید رشته‌ای را که دارای “products/” در ابتدای URL است مطابقت دهد (که در آن “شروع” رشته توسط ^)
  • (\d+) به این معنی است که یک عدد وجود خواهد داشت (مشخص شده توسط \d+) و ما می خواهیم آن را ضبط و استخراج کنیم (مشخص شده توسط پرانتز)
  • / به جنگو می گوید که شخصیت «/» دیگری باید دنبال شود
  • $ پایان URL را نشان می دهد، به این معنی که فقط رشته هایی که به / ختم می شوند با این الگو مطابقت دارند

اعتبارسنجی آدرس های ایمیل

هر سیستم احراز هویت از کاربران می‌خواهد قبل از اینکه به آنها اجازه دسترسی به سیستم داده شود، ثبت نام کرده و وارد سیستم شوند. ما می توانیم از عبارت منظم برای بررسی اینکه آیا آدرس ایمیل ارائه شده در قالب معتبری است یا خیر استفاده کنیم.



import re

email = "(email protected)"

if not re.match(re.compile(r'^.+@(^.).*\.(a-z){2,10}$', flags=re.IGNORECASE), email):
    print("Enter a valid email address")
else:
    print("Email address is valid")

همانطور که می بینید، این یک رشته regex بسیار پیچیده است. بیایید با استفاده از آدرس ایمیل مثال در کد بالا کمی آن را تجزیه کنیم. اساساً به معنای موارد زیر است:

  • ^.+@: هر کاراکتر را از ابتدای رشته تا کاراکتر ‘@’ مطابقت دهید
  • (^.).*: با هر شخصیت مطابقت دهید بجز “.”
  • \.(a-z){2,10}$: کاراکترهای TLD دامنه (با حداکثر طول 10 کاراکتر) را تا انتهای رشته مطابقت دهید

بنابراین، همانطور که انتظار دارید، کد با آدرس مثال ما مطابقت دارد:

$ python validate_email.py 
Email address is valid

اعتبارسنجی شماره تلفن

مثال زیر برای اعتبارسنجی لیستی از اعداد پیشوند کانادایی استفاده می شود:



import re

numbers = ("+18009592809", "=18009592809")

for number in numbers:
    if not re.match(re.compile(r"^(\+1?(-. )?(\d+))$"), number):
        print("Number is not valid")
    else:
        print("Number is valid")
$ python validate_numbers.py 
Number is valid
Number is not valid

همانطور که می بینید، به دلیل اینکه عدد دوم به جای “+” از کاراکتر “=” استفاده می کند، نامعتبر تلقی می شود.

فیلتر کردن محتوای ناخواسته

عبارات منظم همچنین می تواند برای فیلتر کردن برخی کلمات از نظرات پست استفاده شود که به ویژه در پست های وبلاگ و رسانه های اجتماعی مفید است. مثال زیر نشان می دهد که چگونه می توانید کلمات از پیش انتخاب شده را که کاربران نباید در نظرات خود استفاده کنند، فیلتر کنید.



import re

curse_words = ("foo", "bar", "baz")
comment = "This string contains a foo word."
curse_count = 0

for word in curse_words:
    if re.search(word, comment):
        curse_count += 1

print("Comment has " + str(curse_count) + " curse word(s).")
$ python filter.py 
Comment has 1 curse word(s).

نتیجه

این آموزش به مواردی که برای استفاده از عبارات منظم در هر برنامه ای نیاز است، پرداخته است. در صورت تمایل با مستندات مربوط به آن مشورت کنید ماژول مجدد، که دارای منابع زیادی برای کمک به شما در دستیابی به اهداف برنامه خود است.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-29 01:41:03

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید