【问题标题】:Issue detecting if an input contains both letters and numbers检测输入是否同时包含字母和数字的问题
【发布时间】:2022-01-21 22:34:38
【问题描述】:

当使用包含字母和数字的输入运行以下代码时,它不会打印...

# test for both numbers and letters
def multi_test(analysis_input):
    alpha_test = False
    number_test = False
    if analysis_input.isalpha():
     alpha_test = True
     if analysis_input.isnumeric():
        number_test = True
        if alpha_test and number_test:
         print(analysis_input, 'is multiple characters')
        else:
         print('not')



analysis_input = input('enter your string argument')
multi_test(analysis_input)

【问题讨论】:

  • isalpha() 仅在 整个 字符串为字母时返回 true,isnumeric() 仅在 整个 字符串为数字时返回 true。如果字符串同时包含两者,那么这两个方法都不会返回 true。
  • 那是因为isalpha 只是True 如果字符串中的所有字符都是字母。与isnumeric 相同。两者不能同时为真,因此您将始终以else-part 结尾

标签: python


【解决方案1】:

您需要检查每个字符:

def multi_test(analysis_input):
    alpha_test = False
    number_test = False
    for char in analysis_input:
        if char.isalpha():
            alpha_test = True
        if char.isnumeric():
            number_test = True
    if alpha_test and number_test:
        print(analysis_input,'is multiple characters')
    else:
        print('not')



analysis_input = input('enter your string argument')
multi_test(analysis_input)

编辑:可能更快更好的方法是使用正则表达式

^(?=.*[a-zA-Z]+)(?=.*\d+).+
# pseudo code, i'm not sure if this code works but its something like this
return bool(re.match(analysis_input, ^(?=.*[a-zA-Z]+)(?=.*\d+).+))

来自https://stackoverflow.com/a/24656216/10875953的想法

【讨论】:

  • 我想你的意思是if char.isalpha()...
【解决方案2】:

为了好玩,这里有一个替代策略。设置测试列表。对于每个 char 运行所有测试,直到一个匹配。当一项测试为阳性时,将其从测试列表中删除。当列表为空时,您已满足所有要求并且可以停止。

这种方法的优点是只运行必要的测试并在您匹配所有测试后立即停止:

def multi_test(s):
    tests = [str.isalpha, str.isdigit]
    for char in s:   # for each character
        for i,test in enumerate(tests):
            if test(char):    # if test is positive
                tests.pop(i)  # remove it from the list of tests
                break
        if len(tests) == 0:  # if there is no test remaining
            return True      # this is a success, we're done
    return False

multi_test('abc1')
# True

【讨论】:

  • 您的方法让我想到了生成器解决方案:not any(test('abc1') for test in [str.isdigit, str.isalpha])。还应该在内置函数中使用提前停止。
  • @Michael 聪明的方法,但我看到两个缺点,它会输出错误的结果,输入像'a.',并且不能泛化添加两个以上的独占测试;)
【解决方案3】:

您不需要检查每个字符。您的方法朝着正确的方向发展,但 if 语句的缩进和您的逻辑可以改进。删除多余的部分后,您会得到

def multi_test(analysis_input):
    if analysis_input.isnumeric() or analysis_input.isalpha():
        print(analysis_input,'is not mixed')
    else:
        print(analysis_input,'is mixed characters')

一些测试用例

for i in ['1234','12ab', 'abcd','1234abcd']:
    multi_test(i)

输出

1234 is not mixed
12ab is mixed charcters
abcd is not mixed
1234abcd is mixed charcters

【讨论】:

    猜你喜欢
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 2020-12-08
    相关资源
    最近更新 更多