我正在开发一个允许用户输入电子邮件的脚本。如果电子邮件具有“用户名”和“域名”,例如username@domain.com,则程序应输出该电子邮件是电子邮件。如果用户输入诸如username @之类的内容,则程序应输出输入不是有效的电子邮件地址。
当文本是电子邮件时,函数应返回True,否则返回False。
我在输入“username @”或“@ gmail.com”这样的地址时让程序返回False时遇到问题。
我目前有以下代码:
text = ''
tokens = 0
split_counter = 0
def isEmail(text):
tokens = text.split('@')
split_counter = len(tokens)
if split_counter == 2:
print(text, '==> EMAIL')
else:
print(text, '==> NOT EMAIL')
return
while True:
text = input("Email: ")
if text == 'quit':
print('Later!')
break
else:
isEmail(text)
谢谢。
答案 0 :(得分:0)
我建议使用正则表达式并查看StackOverflow上的其他答案以检查有效的电子邮件。 但是在回答你的问题时,根据你上面的评论,当你尝试“@ gmail.com”时,它不会返回false。这是因为当你用“@”分割字符串时,它会返回
string = "@gmail.com"
string.split("@")
>>> ['', 'gmail.com']
因此,返回列表的长度为2。 您可以在split_counter列表中进行另一项检查:
if split_counter == 2 and tokens[0] != '':
print(text, '==> EMAIL')
我建议您打印一路上的任何内容,以便调试代码。它将帮助您避免将来出现这样的错误。你知道条件必须是错误的,条件只依赖于split_counter,所以你可以打印split_counter来看看出了什么问题。
答案 1 :(得分:0)
如果只有一个split
,则@
方法始终返回两个字符串。例如:
>>> text="foo@"
>>> text.split('@')
['foo', '']
因此,您应该检查两个返回的字符串的长度是否大于零。
答案 2 :(得分:0)
您可以看到问题是split()
功能:
>>> text = "@gmail.com"
>>> tokens = text.split("@")
>>> tokens
['', 'gmail.com']
最佳做法是使用regex
检查有效的电子邮件,而不是编写硬代码:
def isEmail(text):
if len(text) > 6:
if re.match(r'\b[\w.-]+@[\w.-]+.\w{2,4}\b', text) != None:
# do something
else:
# do something
如果您不知道regex
是什么,那么这可能是学习它的最佳时机。
答案 3 :(得分:0)
一个简单的解决方案可能是利用all()
以及bool("")
为False
的事实:
>>> email = "@gmail.com"
>>> s = email.split("@")
>>> all(s)
>>> False
>>> email = "a@"
>>> s = email.split("@")
>>> all(s)
>>> False
>>> email = "a@gmail.com"
>>> s = email.split("@")
>>> all(s)
>>> True
但请注意,此代码并未说明"正确性"电子邮件地址。它只说明字符串是否可以被@
拆分而且没有任何部分是空的。
答案 4 :(得分:0)
你所缺少的是第11行的另一张检查:
if split_counter == 2 and len(tokens[0]) > 0 and len(tokens[1]) > 0:
print(text, '==> EMAIL')