验证输入以遵循特定订单

时间:2016-07-11 08:19:53

标签: python

我必须确保输入的电子邮件地址有效。电子邮件地址必须:

  • 以一串字母数字字符开头

  • 后跟@符号

  • 另一串字母数字字符

  • 后跟.

  • 然后是一串字母数字字符。

例如,a@b.cab23@f45.d3都有效,但@bc.d123.c@cvb无效。我将如何编程以确保输入遵循此顺序?

4 个答案:

答案 0 :(得分:2)

使用Regular Expression

一个例子:

import re
if re.search(r'[\w.-]+@[\w.-]+.\w+', email):
    do stuff
else
    do other stuff

答案 1 :(得分:0)

我会将 @ 字符处的字符串拆分为两个新字符串,并检查 @ 左侧的字符串是否只包含字母数字字符。然后我会在字符右侧分割字符串,并检查左右字符串是否只包含字母数字字符。

def test(email):
    left, right = email.split('@')  # 'abc123@mail1.com' -> left = 'abc123', right = 'mail1.com'
    if not left.isalnum():  # If characters to the left of '@' is not alphanumeric or is empty, return False.
        return False

    left, rest = right.split('.')  # 'mail1.com' -> left = 'mail1, right = 'com'
    if not (left.isalnum() and rest.isalnum()):  # If characters to the left and right of '.' is not alphanumeric or is empty, return False.
        return False

    return True  # If it haven't returned False, return True.


# To test if it works as you intended. It works for the cases you provided.
while True:
    print(test(input('Email: ')))

答案 2 :(得分:0)

这是我对此的看法:

def email_valid(email_str):
    if email_str.count('@') != 1 or email_str.count('.') != 1:
        return False
    if len(min(email_str.split('@'))) == 0 or len(min(email_str.split('@')[1].split('.'))) == 0:
        return False
    parts = email_str.split('@')[1].split('.') + [email_str.split('@')[0]]
    return True if all(x.isalnum() for x in parts) else False

check = False
while not check:
    check = email_valid(input('Please provide an email:\t'))

print('Email accepted!')

检查以确保在提供的字符串中只能找到'@', '.'一次,并且在它们之前和之后的字符串部分是字母数字&非空。

但是,此处实施的规则不是通常应用于电子邮件帐户的规则。有关这些列表,请参阅the syntax paragraph of this article

答案 3 :(得分:0)

这是另一种非正则表达方式:

def validate_email(email):
    user, sep, domain = email.partition('@')
    parts = [user]
    parts.extend(domain.split('.'))
    return len(parts) == 3 and all(part.isalnum() for part in parts)

>>> for email in 'a@b.c', 'ab23@f45.d3', 'a_b@p_q.com', '@bc.d', '123.c@cvb', '', '@', 'a@b@c', '@.', 'abc&**&@test.com':
...     print(validate_email(email)) 
True
True
False
False
False
False
False
False
False
False

电子邮件地址的域部分仅限于由.分隔的两个部分。有效的电子邮件域至少包含三个部分,因此,如果您想支持,请删除len(parts) == 3测试。

这是一个有效的正则表达式模式:

import re

def validate_email(email):
    return re.match(r'[a-zA-Z\d]+@[a-zA-Z\d]+\.[a-zA-Z\d]+$', email) != None

>>> for email in 'a@b.c', 'ab23@f45.d3', 'a_b@p_q.com', '@bc.d', '123.c@cvb', '', '@', 'a@b@c', '@.', 'abc&**&@test.com':
...     print(validate_email(email)) 
True
True
False
False
False
False
False
False
False
False

您无法在模式中使用\w,因为这将与下划线字符匹配,通常不会将其视为字母数字。模式末尾需要$,以确保电子邮件地址的最后一段仅以字母数字字符结尾。在一系列有效字符匹配后,出现在字符串末尾的无关无效字符。

在这种情况下,我选择使用基本字符串函数的第一种方法,因为它(可以说)比正则表达式更容易阅读和维护。