[英]If Value in Split List is Empty Return False
我正在編寫一個允許用戶輸入電子郵件的腳本。 如果電子郵件具有“用戶名”和“域名”,例如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)
謝謝。
我建議使用正則表達式並查看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來查看出錯的地方。
如果只有一個@
, split
方法總是返回兩個字符串。 例如:
>>> text="foo@"
>>> text.split('@')
['foo', '']
所以你應該檢查兩個返回的字符串的長度是否大於零。
你可以看到問題是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
,那么這可能是學習它的最佳時機。
一個簡單的解決方案可能是利用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
但請注意,此代碼並未說明電子郵件地址的“正確性”。 它只說明一個字符串是否可以被@
拆分而且沒有一個部分是空的。
所有你遺失的是第11行的另一張檢查:
if split_counter == 2 and len(tokens[0]) > 0 and len(tokens[1]) > 0:
print(text, '==> EMAIL')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.