如果拆分列表中的值为空,则返回False

时间:2017-03-09 08:22:50

标签: python python-3.x

我正在开发一个允许用户输入电子邮件的脚本。如果电子邮件具有“用户名”和“域名”,例如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)

谢谢。

5 个答案:

答案 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

但请注意,此代码并未说明"正确性"电子邮件地址。它只说明字符串是否可以被@拆分而且没有任何部分是空的。

为此,我将依赖Django之类的框架或类似WTForms之类的框架提供的验证器。

答案 4 :(得分:0)

你所缺少的是第11行的另一张检查:

if split_counter == 2 and len(tokens[0]) > 0 and len(tokens[1]) > 0:
    print(text, '==> EMAIL')