如何在 python 上 re.search 模块

How to re.search module on python

在我的程序的一部分中,我必须检查输入的电子邮件,我想这样做以便任何域名都可以用于检查器,当前代码如下;

import re #needed to check email
emailFormat = '^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w+$' #general form of email

def check(email):  #Validation for email
    if(re.search(emailFormat,email)): #pass expression and string in  search() 
        return "Valid Email"
    else:  
        return "Invalid Email"

enterEmail=str(input('enter email'))

print(check(enterEmail))

目前,这适用于 example@email.com 中的任何电子邮件,但由于某些电子邮件的格式为 example@email.co.uk 所以我如何才能使 'emailFormat' 对任何域形式。此外,检查将适用于 company/school 电子邮件,例如 example@school.com 或 example@email.school 任何不包含 'two-part' 域名的邮件,例如 'co.uk' 所以我需要另一个变量来检查它还是可以在一个命令中完成。

提前感谢任何有用的东西。

这也适用于两个字母域,email.school 也适用。

import re #needed to check email
emailFormat = r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)"

def check(email):  #Validation for email
    if(re.search(emailFormat,email)): #pass expression and string in  search()
        return "Valid Email"
    else:
        return "Invalid Email"

enterEmail=str(input('enter email'))

print(check(enterEmail))

进一步阅读以上内容:- https://emailregex.com/

您可以使用此代码并选择最大子域数。根据 this link,电子邮件限制为 255 字节,因此子域不能超过 120 个! 试试30个子域名,我觉得绰绰有余了。

import re  # needed to check email

def CheckEmail(email):  # Validation for email
    '''
    Validation for Email

    input:
    email as "String"

    output: ( validation, Email Parts ) as tuple
    Validation as "String"
    Email Parts as if Valid as List, otherwise None
    '''

    # Can be decreased. The maximum is 125. according to the link below, the email limmitation is 255 bytes.
    subDomainCount = 30

    # This is a subdomain pattern
    subDomainPattern = r"\.?([\w-]+)?"

    # General form of email with maximum subDomainCount parameter
    pattern = r"([\w\.-]+)@" + r"([\w-]+)" + (subDomainPattern * subDomainCount) + r"\.([\w-]+)"

    # Validation: True, False
    emailIsValid = re.search(pattern, email)

    # Conditional Statement
    if emailIsValid:

        # Condition multiple dots with no letters between them
        dotpattern = r"[\.]{2}"
        if re.search(dotpattern,email):
            return "Invalid Email", None

        # Finding Email Parts (user + domains)
        emailParts = emailIsValid.groups()
        
        # removing empty subdomains
        emailParts = [x for x in emailParts if x is not None]
        
        return "Valid Email", emailParts
    else:
        return "Invalid Email", None



enteredEmail = input("Enter Email: ")
(validation, emailParts) = CheckEmail(enteredEmail)
print(validation)
print("Email Parts:",emailParts)

航站楼:

Enter Email: test3475@website.acro.us
Valid Email
Email Parts: ['test3475', 'website', 'acro', 'us']
Enter Email: test_third@mail.rop.qot.wkfc.org
Valid Email
Email Parts: ['test_third', 'mail', 'rop', 'qot', 'wkfc', 'org']
Enter Email: testmega@mail..com
Invalid Email
Email Parts: None
Enter Email: testbored@mail
Invalid Email
Email Parts: None

您可以通过考虑用户输入的电子邮件的长度来改变 subDomainCount 参数,但我认为没有必要。 如果想深入了解re模块,我自己是从SoloLearn那里学来的。 (在 Python3 课程中,您可以找到模块 9:正则表达式。