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

سرور مجازی NVMe

پایتون: اعتبارسنجی آدرس ایمیل با عبارات منظم (RegEx)

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


معرفی

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

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

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

اگر می‌خواهید درباره رابط پایتون با عبارات با قاعده بیشتر بدانید، راهنمای ما برای عبارات منظم در پایتون را بخوانید!

عبارت منظم ایمیل عمومی

شایان ذکر است که هیچ عبارت منظمی وجود ندارد که مطابقت داشته باشد هر آدرس ایمیل معتبر ممکن اگرچه، عباراتی وجود دارد که می توانند مطابقت داشته باشند اکثر آدرس های ایمیل معتبر

باید نوع آدرس ایمیل را مشخص کنیم قالب آیا ما به دنبال آن هستیم رایج ترین فرمت ایمیل عبارت است از:

(username)@(domainname).(top-leveldomain)

بنابراین، ما می توانیم آن را به یک الگوی از @ نمادی که پیشوند را از بخش دامنه تقسیم می کند.

این پیشوند نام گیرنده است – رشته ای که ممکن است شامل حروف بزرگ و کوچک، اعداد و برخی کاراکترهای خاص مانند . (نقطه)، -(خط فاصله)، و _ (تاکید کنید).

این دامنه شامل نام آن و یک دامنه سطح بالا تقسیم بر a است . (نقطه) نماد. نام دامنه می تواند دارای حروف بزرگ و کوچک، اعداد و - علامت های ( خط تیره ) علاوه بر این، نام دامنه سطح بالا باید حداقل 2 کاراکتر (یا همه حروف بزرگ یا کوچک) باشد، اما می تواند طولانی تر باشد.

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

به زبان ساده، عبارت Regular Expression ایمیل ما می تواند به شکل زیر باشد:

(string1)@(string2).(2+characters)

این به درستی برای آدرس‌های ایمیل مانند:

(email protected)
(email protected)
(email protected)

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

johnsnow@gmail
(email protected)
myemail@outlook.

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

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

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

در مورد دامنه، یک ایمیل می تواند حاوی چند دامنه سطح بالا باشد که با یک نقطه تقسیم می شوند.

بدیهی است که این regex پیچیده تر از مورد اول است، اما تمام قوانینی را که ما برای قالب ایمیل تعریف کرده ایم را پوشش می دهد. با این حال، احتمالاً ممکن است نتواند به درستی برخی از موارد لبه‌ای را که ما به آن فکر نکرده‌ایم تأیید کند.

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

این re ماژول شامل کلاس ها و متدهایی برای نمایش و کار با عبارات منظم در پایتون است، بنابراین ما این کار را انجام خواهیم داد import آن را در فیلمنامه ما. روشی که ما استفاده خواهیم کرد این است re.fullmatch(pattern, string, flags). این متد فقط در صورتی شیء مطابقت را برمی گرداند کل رشته با الگو مطابقت دارد، در هر حالت دیگری برمی گردد None.

توجه داشته باشید: re.fullmatch() قبل از آن در پایتون 3.4 معرفی شد، re.match() به جای آن استفاده شد. در نسخه های جدیدتر، fullmatch() ترجیح داده می شود.

اجازه دهید compile() عبارت Regular Expression از قبل، و یک تابع ساده تعریف کنید که یک آدرس ایمیل را می پذیرد و از عبارت برای اعتبارسنجی آن استفاده می کند:

import re

regex = re.compile(r'((A-Za-z0-9)+(.-_))*(A-Za-z0-9)+@(A-Za-z0-9-)+(\.(A-Z|a-z){2,})+')

def isValid(email):
    if re.fullmatch(regex, email):
      print("Valid email")
    else:
      print("Invalid email")

این re.compile() متد یک الگوی regex را در یک شی regex کامپایل می کند. زمانی که برنامه ریزی می کنیم بیشتر به دلایل کارایی استفاده می شود روی تطبیق الگوی بیش از یک بار

حالا بیایید کد را تست کنیم روی برخی از نمونه هایی که قبلا به آنها نگاه کردیم:

isValid("(email protected)")
isValid("(email protected)")
isValid("(email protected)")
isValid("(email protected)")

این نتیجه در:

Valid email
Valid email
Invalid email
Invalid email

عالی است، ما یک سیستم کارآمد داریم!

بیان منظم ایمیل قوی

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

عبارات طولانی کمی پیچیده و خواندن آنها سخت است و این عبارت نیز از این قاعده مستثنی نیست:

(?:(a-z0-9!#$%&'*+/=?^_`{|}~-)+(?:\.(a-z0-9!#$%&'*+/=^_`{|}~-)+)*
|"(?:(\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f)
|\\(\x01-\x09\x0b\x0c\x0e-\x7f))*")
@
(?:(?:(a-z0-9)(?:(a-z0-9-)*(a-z0-9))?\.)+(a-z0-9)(?:(a-z0-9-)*(a-z0-9))?
|\((?:(?:(2(5(0-5)|(0-4)(0-9))
|1(0-9)(0-9)|(1-9)?(0-9)))\.){3}(?:(2(5(0-5)|(0-4)(0-9))
|1(0-9)(0-9)|(1-9)?(0-9))|(a-z0-9-)*(a-z0-9):(?:(\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f)
|\\(\x01-\x09\x0b\x0c\x0e-\x7f))+)\))

این است RFC5322-Compliant Regular Expression که 99.99% از آدرس‌های ایمیل ورودی را پوشش می‌دهد.* توضیح آن با کلمات معمولاً از جدول خارج است، اما تجسم آن کمک زیادی می‌کند:

پایتون: اعتبارسنجی آدرس ایمیل با عبارات منظم (RegEx)

*تصویر و ادعا از حسن نیت ارائه شده است EmailRegex.com.

این در واقع تنها عبارتی نیست که RFC5322 را برآورده می کند. بسیاری از آنها با درجات مختلف موفقیت انجام می دهند. یک نسخه کوتاه‌تر که همچنان با مشخصات مطابقت دارد می‌تواند به راحتی به پایتون وارد شود re.compile() روش برای نشان دادن یک عبارت:

import re

regex = re.compile(r"((-!#-'*+/-9=?A-Z^-~)+(\.(-!#-'*+/-9=?A-Z^-~)+)*|\"(()!#-(^-~ \t)|(\\(\t -~)))+\")@((-!#-'*+/-9=?A-Z^-~)+(\.(-!#-'*+/-9=?A-Z^-~)+)*|\((\t -Z^-~)*))")

def isValid(email):
    if re.fullmatch(regex, email):
        print("Valid email")
    else:
        print("Invalid email")

isValid("(email protected)")
isValid("(email protected)")
isValid("(email protected)")
isValid("(email protected)")

این نیز منجر به:

Valid email
Valid email
Invalid email
Invalid email

نتیجه

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

هر قانون جدید درجه آزادی را کاهش می دهد روی آدرس های پذیرفته شده

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



منتشر شده در 1403-01-07 22:33:03

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

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

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