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

سرور مجازی NVMe

بررسی کنید که آیا عناصر موجود در لیست با Regex در پایتون مطابقت دارد یا خیر

0 6
زمان لازم برای مطالعه: 4 دقیقه


معرفی

فرض کنید فهرستی از آدرس‌های خانه دارید و می‌خواهید ببینید کدام یک در “خیابان”، “خیابان”، “لین” و غیره قرار دارند. با توجه به متغیر بودن آدرس‌های فیزیکی، احتمالاً می‌خواهید از یک عبارت معمولی استفاده کنید. تطبیق را انجام دهید اما چگونه می توان یک regex را برای یک لیست اعمال کرد؟ این دقیقاً همان چیزی است که ما در این بایت به آن نگاه خواهیم کرد.

چرا لیست ها را با عبارات منظم مطابقت دهیم؟

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

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

ماژول Regex پایتون

پایتون re ماژول پشتیبانی داخلی از عبارات منظم را فراهم می کند. می توانید آن را به صورت زیر وارد کنید:

import re

را re ماژول چندین عملکرد برای کار با عبارات منظم دارد، مانند match()، search()، و findall(). ما از این توابع استفاده خواهیم کرد تا بررسی کنیم که آیا عنصری در لیست با یک عبارت منظم مطابقت دارد یا خیر.

با استفاده از همخوانی داشتن() تابع

برای بررسی اینکه آیا هر عنصری در لیست با یک عبارت منظم مطابقت دارد، می توانید از یک حلقه برای تکرار روی لیست و re ماژول ها match() عملکرد برای بررسی هر عنصر. در اینجا یک مثال است:

import re


list_of_strings = ('apple', 'banana', 'cherry', 'date')


pattern = '^a'

for string in list_of_strings:
    if re.match(pattern, string):
        print(string, "matches the pattern")

در این مثال، match() تابع بررسی می کند که آیا هر رشته در لیست با حرف “a” شروع می شود یا خیر. خروجی خواهد بود:

apple matches the pattern

توجه داشته باشید: را ^ کاراکتر در الگوی عبارت منظم شروع رشته را نشان می دهد. بنابراین، ^a با هر رشته ای که با ‘a’ شروع می شود مطابقت دارد.

پیشنهاد می‌کنیم بخوانید:  روش کپی کردن اشیا در جاوا اسکریپت یک کار بسیار رایج در برنامه نویسی، صرف نظر از زبان، کپی کردن (یا شبیه سازی) یک شی بر اساس مقدار است، در مقابل کپی کردن با مرجع. تفاوت این است که هنگام کپی کردن بر اساس مقدار، دو شیء نامرتبط با مقدار یا داده یکسان دارید. کپی کردن با مرجع به این معنی است که شما...

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

((A-Za-z0-9)+(.-_))*(A-Za-z0-9)+@(A-Za-z0-9-)+(\.(A-Z|a-z){2,})+

با استفاده از جستجو کردن() تابع

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

import re

my_list = ('Hello World', 'Python Hello', 'Goodbye World', 'Say Hello')
pattern = "Hello"

for element in my_list:
    if re.search(pattern, element):
        print(f"'{element}' matches the pattern.")

خروجی خواهد بود:

'Hello World' matches the pattern.
'Python Hello' matches the pattern.
'Say Hello' matches the pattern.

همانطور که می بینید، re.search() رشته‌هایی را که حاوی “Hello” هستند، در همه جا یافتند، نه فقط در ابتدا.

با استفاده از تابع ()finall

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

import re

my_list = ('Hello Hello', 'Python Hello', 'Goodbye World', 'Say Hello Hello')
pattern = "Hello"

for element in my_list:
    matches = re.findall(pattern, element)
    if matches:
        print(f"'{element}' contains {len(matches)} occurrence(s) of 'Hello'.")

خروجی خواهد بود:

'Hello Hello' contains 2 occurrence(s) of 'Hello'.
'Python Hello' contains 1 occurrence(s) of 'Hello'.
'Say Hello Hello' contains 2 occurrence(s) of 'Hello'.

کار با لیست های تودرتو

اگر لیست ما حاوی لیست های دیگری باشد چه اتفاقی می افتد؟ پایتون re توابع ماژول مستقیماً روی لیست‌های تودرتو کار نمی‌کنند، درست مثل اینکه با لیست ریشه در مثال‌های قبلی کار نمی‌کنند. ما باید فهرست را مسطح کنیم یا در هر زیر لیست تکرار کنیم.

بیایید لیستی از لیست ها را در نظر بگیریم که در آن هر زیر لیست شامل رشته ها است. می خواهیم بدانیم کدام رشته ها حاوی “Hello” هستند.

import re

my_list = (('Hello World', 'Python Hello'), ('Goodbye World'), ('Say Hello'))
pattern = "Hello"

for sub_list in my_list:
    for element in sub_list:
        if re.search(pattern, element):
            print(f"'{element}' matches the pattern.")

خروجی خواهد بود:

'Hello World' matches the pattern.
'Python Hello' matches the pattern.
'Say Hello' matches the pattern.

ابتدا هر زیر لیست را در لیست اصلی حلقه می کنیم. سپس برای هر زیر لیست، عناصر آن را حلقه زده و اعمال می کنیم re.search() برای یافتن رشته های منطبق

پیشنهاد می‌کنیم بخوانید:  پایتون: لیست فایل ها در یک فهرست

کار با لیست های ترکیبی نوع داده

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

import re

mixed_list = (1, 'apple', 3.14, 'banana', '123', 'abc123', '123abc')

regex = r'\d+'  

for element in mixed_list:
    if isinstance(element, str) and re.match(regex, element):
        print(f"{element} matches the regex")
    else:
        print(f"{element} does not match the regex or is not a string")

در این حالت خروجی به صورت زیر خواهد بود:

1 does not match the regex or is not a string
apple does not match the regex or is not a string
3.14 does not match the regex or is not a string
banana does not match the regex or is not a string
123 matches the regex
abc123 does not match the regex or is not a string
123abc matches the regex

ابتدا بررسی می کنیم که آیا عنصر فعلی یک رشته است یا خیر. فقط پس از آن بررسی می کنیم که آیا با عبارت منظم مطابقت دارد یا خیر. این به این دلیل است که re.match() تابع انتظار یک رشته را به عنوان ورودی دارد. اگر سعی کنید از آن در یک عدد صحیح یا یک شناور استفاده کنید، پایتون یک خطا ایجاد می کند.

نتیجه

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





منتشر شده در 1402-12-27 02:53:06

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

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

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