我必须确保输入的电子邮件地址有效。电子邮件地址必须:
以一串字母数字字符开头
后跟@
符号
另一串字母数字字符
后跟.
然后是一串字母数字字符。
例如,a@b.c
和ab23@f45.d3
都有效,但@bc.d
和123.c@cvb
无效。我将如何编程以确保输入遵循此顺序?
答案 0 :(得分:2)
一个例子:
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
,因为这将与下划线字符匹配,通常不会将其视为字母数字。模式末尾需要$
,以确保电子邮件地址的最后一段仅以字母数字字符结尾。在一系列有效字符匹配后,出现在字符串末尾的无关无效字符。
在这种情况下,我选择使用基本字符串函数的第一种方法,因为它(可以说)比正则表达式更容易阅读和维护。