【问题标题】:check a string is true for two functions in python (string manipulation)检查python中两个函数的字符串是否为真(字符串操作)
【发布时间】:2017-11-30 06:34:10
【问题描述】:

我有以下代码,虽然它仅用于检查一个函数(比如小写字母),但在引入两个条件时它会停止工作。有人可以出于教学目的阐明为什么会这样,给出解决方案并解释原因。注意:这不是任何其他问题的重复,因为其他示例没有明确处理字符串布尔命令。

预期结果:仅当用户名输入为小写且包含数字时,才应生成电子邮件地址。 (例如,username123 可以接受,USER 不可以,USER123 不可以)

解决方案/答案必须简单,最好不包括重写代码(即尽可能不重写函数和引入参数等)

代码:

def main():
   print("*************************** Create an e-mail address*********************")
   print("***************************                                               ********************** ")

   username=input("Please enter your desired username:" )

   if username.islower() and username.isdigit():
         email=username+"@gmail.com"
         print("Your unique email address is now:", email)
   else:
         print("Your username needs to be lower case ...............")
         main()

main()

如前所述,以下代码(仅检查 islower)可以工作....

   if username.islower():
         email=username+"@gmail.com"
         print("Your unique email address is now:", email)
   else:
         print("Your username needs to be lower case ...............")
         main()

工作输出:

*************************** Create an e-mail address*********************
***************************                                               ********************** 
Please enter your desired username:USER
Your username needs to be lower case ...............
*************************** Create an e-mail address*********************
***************************                                               ********************** 
Please enter your desired username:user
Your unique email address is now: user@gmail.com
>>> 

更新: 有人认为是因为缺少 (),但事实并非如此:

def main():
   print("*************************** Create an e-mail address*********************")
   print("***************************                                               ********************** ")

   username=input("Please enter your desired username:" )
   if username.islower() and username.isdigit():
         email=username+"@gmail.com"
         print("Your unique email address is now:", email)
   else:
         print("Your username needs to be lower case ...............")
         main()
main()

错误输出:

*************************** Create an e-mail address*********************
***************************                                               ********************** 
Please enter your desired username:USER
Your username needs to be lower case ...............
*************************** Create an e-mail address*********************
***************************                                               ********************** 
Please enter your desired username:user
Your username needs to be lower case ...............
*************************** Create an e-mail address*********************
***************************                                               ********************** 
Please enter your desired username:user123
Your username needs to be lower case ...............
*************************** Create an e-mail address*********************
***************************                                               ********************** 
Please enter your desired username:

删除递归 main() 调用也不会改变:

def main():
   print("*************************** Create an e-mail address*********************")
   print("***************************                                               ********************** ")
   username=input("Please enter your desired username:" )
   if username.islower() and username.isdigit():
         email=username+"@gmail.com"
         print("Your unique email address is now:", email)
   else:
         print("Your username needs to be lower case and contain digits...............")
main()

错误输出:

Please enter your desired username:USERNAME
Your username needs to be lower case and contain digits...............
>>> main()
*************************** Create an e-mail address*********************
***************************                                               ********************** 
Please enter your desired username:username123
Your username needs to be lower case and contain digits...............
>>> 

使用 OR 代替 AND 也不起作用

下面的输出,当更改为 OR 时

Please enter your desired username:USERNAME
Your username needs to be lower case and contain digits...............
>>> main()
*************************** Create an e-mail address*********************
***************************                                               ********************** 
Please enter your desired username:username
Your unique email address is now: username@gmail.com
>>> 

使用 set(range(10)).intersection 在下面尝试另一个建议的答案:

以下 - 仍然无法正常工作:

def main():
   print("*************************** Create an e-mail address*********************")
   print("***************************                                               ********************** ")
   username=input("Please enter your desired username:" )
   #if username.islower() or username.isdigit():
   if username.islower() and set(range(10)).intersection(username):
         email=username+"@gmail.com"
         print("Your unique email address is now:", email)
   else:
         print("Your username needs to be lower case and contain digits...............")
main()

输出

  >>> main()
    *************************** Create an e-mail address*********************
    ***************************                                               ********************** 
    Please enter your desired username:user
    Your username needs to be lower case and contain digits...............
    >>> main()
    *************************** Create an e-mail address*********************
    ***************************                                               ********************** 
    Please enter your desired username:username123
    Your username needs to be lower case and contain digits...............
    >>> 

【问题讨论】:

  • 您忘记了第一个示例中 islower() 函数调用的括号。
  • 对不起,我已经在代码中添加了。那是在原始代码中 - 并且不起作用。运行它看看 -!
  • 你的第一个代码 sn-p 是递归的;你打电话给main()main()
  • 克里斯,是的,但删除它并不能解决问题(请参阅更新)
  • 'and username.isdigit()' ... 'user' 对此是错误的。你的意思是'而不是 username.isdigit()' 并且要求双方都评估为 True

标签: python string function conditional-statements


【解决方案1】:

据说你的代码的问题是如果你执行username.isdigit()它会返回False语句,因为变量username没有完全用数字填充,但是islower()是不那么严格:

username = input(' -->> ')
-->> abc123

username.isdigit()

错误

username.islower()

是的

在您的具体情况下,如果有大写字母,您可以省略警告,因为您可以将它们转换为小写字母。 如果您需要一个同时检查大写字母的解决方案,那么您还应该阅读最后的附加部分

如果 username 的结构并没有真正困扰您,即您只是希望它同时包含小写字母和数字,那么您可以简单地使用regex 检查它们是否都存在:

import re  # regular expressions

username = 'Abc123'  # similar to input() as it also returns 'str' class

if re.match('^[a-z0-9]*$', username.lower()):  # username.lower() makes letters lowercase. You could assign it to a new variable if needed.
    email = username.lower() + '@gmail.com'
    print('Your e-mail address is: {}'.format(email))

例如,即使username = 'A1b2C3' 也能正常工作。


但是,如果结构很重要,并且您希望不惜一切代价让数字跟随字母,则应将 用户名 分成两个子集,一个包含字母,另一个包含数字,并检查两者是否都存在于正确的顺序。 请注意,这只是个人方法

  • 首先,我们检查用户名是否可以连续分成两组字母和数字,不能多也不能少;

  • 其次,我们检查第一个子集是否包含字母,第二个子集是否包含数字;

  • 如果条件满足,那么我们就创建一个电子邮件。

代码应该如下:

import re

print('Example of username: george1337')
username = 'Abc123'; username = username.lower()

if len(re.findall('\d+|\D+', username)) == 2:
    subset_1, subset_2 = [subset for subset in re.findall('\d+|\D+', username)]
else:
    print('Not valid username: see example')

if subset_1.islower() and subset_2.isdigit():
    email = username + '@gmail.com'
    print('Your e-mail address is: {}'.format(email))
else:
    print('Digits must follow letters, not vice versa')

您的电子邮件地址是:abc123@gmail.com

username = 'a2BB3dd4'; username = username.lower()

if len(re.findall('\d+|\D+', username)) == 2:
    subset_1, subset_2 = [subset for subset in re.findall('\d+|\D+', username)]
else:
    print('Not valid username: see example')

用户名无效:见示例


附加部分

好的。如果你想在有大写字母时发出警告,那么你不应该执行username = username.lower()。 '大写条件'将在第二部分自动检查,因为有if subset_1.islower()。然后您应该简单地添加另一个print,表示不允许使用大写字母。第一部分也是如此。

希望对你有帮助!

【讨论】:

    【解决方案2】:

    这一行的问题

    if username.islower() and username.isdigit()

    isdigit() 仅在整个字符串为数字时才返回 True,而 islower() 显然仅在整个字符串为小写字符时才返回 True。这意味着该语句将始终失败,因为这两个条件都不为真。

    如果我们重新思考一下逻辑,我们需要测试的是电子邮件仅包含字母数字字符(数字和字母),但不包含任何大写字母。这给了我们:

    if username.isalnum() and (not any(c.isupper() for c in username)

    【讨论】:

      【解决方案3】:

      你可以创建一个简单的函数

      def hasNumbers(inputString):
            return any(char.isdigit() for char in inputString)
      .
      .
      .
      if username.islower() and hasNumbers(username):
      .
      .
      .
      

      然后在 if 语句中使用它。这是我找到它的来源:check if a string contains a number。 如果您愿意,也可以使用 re 模块使用正则表达式。但是对于这么小的东西,我建议你使用一个单独的函数。它是一个更...更简单的解决方案。

      正则表达式版本:

      import re
      
      def main():
         print("*************************** Create an e-mail address*********************")
         print("***************************                                               ********************** ")
      
         username=str(input("Please enter your desired username:" ))
      
         pat = re.compile(r'\d')
      
         if username.islower() and re.search(pat, username):
               email=username+"@gmail.com"
               print("Your unique email address is now:", email)
         else:
               print("Your username needs to be lower case ...............")
               main()
      
      main()
      

      【讨论】:

      • 将其更改为“或”而不是“和”也不起作用。查看输出编辑
      • 取决于 OP 是否打算允许数字用户名:如果不打算将数字作为用户名,则第二部分需要 not 运算符。
      • 我同意。我试图找出他真正想要的输出。
      • 哦,我现在明白了。他希望用户名包含小写字母和数字
      • 来自此链接:stackoverflow.com/questions/19859282/… 使用函数 def hasNumbers(inputString): return any(char.isdigit() for char in inputString) 并使用传递字符串作为参数的函数。然后,您需要做的就是更改错误消息。对不起,*她
      猜你喜欢
      • 2017-01-11
      • 1970-01-01
      • 2021-11-02
      • 2016-04-07
      • 2014-06-23
      • 1970-01-01
      • 2018-06-08
      • 2017-11-28
      相关资源
      最近更新 更多