2016-10-11 78 views
-1

我想在我的类中包含用户输入的正则表达式检查。我想要一个场景,用户在输入有效的电子邮件地址之前不能继续输入他们的名字。目前的代码我没有按预期工作。虽然在python类中循环

我想一个while循环是为了这里,但我很努力在这个类中实现。任何援助非常感谢。所有的

class test: 
def __init__(self):  
    self.email = input("Enter your email: ") 
    email_check = re.search(r'[\w.-][email protected][\w.-]+.\w+', self.email) 
    if email_check: 
     print ('email valid') 
    else: 
     print ('email not valid') 
     self.email = input("Enter your email: ")    
     sys.exit(0) 
    self.name = input("Enter your name: ")   

回答

0

首先 - 你不应该实施任何这类活动纳入__init__方法,作为一个旨在为对象字段初始化首位。考虑专门的'check_email'方法,或者任何最适用的名称。现在

,关于你的情况:

class test: 
    def __init(self): 
     # whatever initialization applies 
     pass 

    def init_emails(): 
     emails = [] 
     proceed = True 
     # if you really in need of do/while loop 
     while proceed: 
      email = self.input_email() 
      # your logic for input 
      if email is not None: 
       emails.append(email) 
      # invalid input or cancel 
      else: 
       proceed = False 
     return input 

    def input_email(self): 
     value = input('Enter your email:') 
     # TODO: validate/check input 
     return proper_value 
+0

我第二个评论,这不属于'__init__'或可能甚至在一个类中。用户交互应该可能发生在类之外,除非它是专门实现用户交互的类。如果它发现自己填充了无效数据,那么你的类可能应该“抛出”一个错误。 – tripleee

1

你可以不喜欢这样。

while True: 
    self.email = input ("Enter email:") 
    if valid_email: 
     break 

替换valid_email与您确认的电子邮件地址的方式。

您可能也有兴趣Python check for valid email address?验证电子邮件地址的方法。

+0

谢谢。这正是我期待的。 – jebjeb

0
class test: 
    def __init__(self):  
     self.email = self.get_name() 

    def get_name(self) : 
     while True: 
      x = input("Enter your email: ") 
      if (re.search(r'[\w.-][email protected][\w.-]+.\w+', x)) : 
       return x 
0

该脚本的功能与描述的一样,最后打印名称和电子邮件。如果您需要使用python2.7,请使用raw_input而不是input。我用for i in range而不是while True来避免无限循环。

#!/usr/bin/env python3 

import re 
import sys 


class Test(object): 
    def __init__(self): 
     self.email = None 
     self.name = None 

    def get_email(self): 
     for i in range(3): 
      email = input('Enter your email: ') 
      if re.search('[\w.-][email protected][\w.-]+.\w+', email): 
       return email 
     print('Too many failed attempts!') 
     sys.exit(1) 

    def get_name(self): 
     for i in range(3): 
      name = input('Enter your name: ') 
      if name: 
       return name 
      print('Too many failed attempts!') 
      sys.exit(1) 

    def initialize(self): 
     self.email = self.get_email() 
     self.name = self.get_name() 
     print('"{}" <{}>'.format(self.name, self.email)) 


if __name__ == '__main__': 
    t = Test() 
    t.initialize() 
0

而不是输入,尝试使用raw_input。像这样:

self.email = raw_input("Enter your email:") 

不会有错误了。 希望这有助于。

+1

在Python 3中,'input'相当于Python 2的'raw_input'(请参阅https://www.python.org/dev/peps/pep-3111/)。根据原始代码中打印函数(而不是语句)的用法,我会假定OP使用Python 3。 – mgwilliams