如何检查一个字符串仅包含“a-z”、“A-Z”和“0-9”字符

10

我正在导入string,并尝试检查文本是否仅包含"a-z"、"A-Z"和"0-9"。

但是当我输入字母和数字时,我只会获得输入,而不会打印出成功。

import string
text=input("Enter: ")
correct = string.ascii_letters + string.digits
if text in correct:
    print("Success")

你介意有空格吗? - Josh Sharkey
correct = set(string.ascii_letters + string.digits);all(c in correct for c in text) - Alexander
如果 ((letter_guessed >= 'A') and (letter_guessed <= 'Z')),则结果为True。 否则,如果 ((letter_guessed >= 'a') and (letter_guessed <= 'z')),则结果为True。 - Guy Cohen
7个回答

17

您可以使用正则表达式来实现,例如对字符串进行以下模式匹配:

import re
pattern = re.compile("[A-Za-z0-9]+")
pattern.fullmatch(string)

解释:

[A-Za-z0-9] 匹配 A-Z, a-z 和 0-9 范围内的字符,即字母和数字。

+ 表示匹配前面的模式出现一次或多次。

re.fullmatch() 方法允许检查整个字符串是否与正则表达式模式匹配。如果找到匹配,则返回相应的匹配对象,否则如果字符串不匹配模式,则返回None

综上所述:

import re

if __name__ == '__main__':
    string = "YourString123"
    pattern = re.compile("[A-Za-z0-9]+")

    # if found match (entire string matches pattern)
    if pattern.fullmatch(string) is not None:
        print("Found match: " + string)
    else:
        # if not found match
        print("No match")

2
如果你想的话,你也可以使用 pattern = re.compile("[a-z0-9]", re.I)。(re.Ire.IGNORECASE 的缩写。) 但这与已经存在的内容相同。 - David Culbreth

11
只需使用str.isalnum()即可。
>>> "123AbC".isalnum()
True
>>> "1&A".isalnum()
False

参考文档:

如果字符串中的所有字符都是字母数字且至少有一个字符,则返回 true;否则返回 false。字符 c 是字母数字的条件之一是以下任何一个返回 Truec.isalpha()c.isdecimal()c.isdigit()c.isnumeric()

如果不想检查 str.isdigit()str.isnumeric(),以允许数字中包含小数点,请使用 str.isnumeric()str.isalpha()

>>> all(c.isnumeric() or c.isalpha() for c in "123AbC")
True
>>> all(c.isnumeric() or c.isalpha() for c in "1&A")
False

如果你想使用re,你可以查看vs97的回答。或者,如果你不介意包含下划线(_),这也可以正常工作:
>>> re.fullmatch("\w", "123AbC", re.A)
True
>>> re.fullmatch("\w", "1&A", re.A)
False

这个工作是因为当使用re.ASCI标志(简称re.A)时,\w[a-zA-Z0-9_]匹配。
再次参考文档中关于\w的说明:
对于Unicode(str)模式: 匹配Unicode单词字符;这包括字母数字字符(由str.isalnum()定义)以及下划线(_)。如果使用了ASCII标志,则只匹配[a-zA-Z0-9]。

1
这应该是最佳答案。 - Mark Mayo

1
您需要逐个比较输入文本中的每个字母。
import string
text = input("Enter: ")
correct = string.ascii_letters + string.digits
status = True
for char in text:
    if char not in correct:
        status = False
if status:
    print('Correct')
else:
    print('InCorrect')

0

您正在测试整个字符串是否在字符串'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'

假设输入为'testInput'

您正在检查'testInput'是否在字符串'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'中,但实际上它不在其中。

您需要逐个检查每个字符

您可以使用一个函数来轻松完成此操作

import string
def validCharacters(text):
    correct = string.ascii_letters + string.digits
    for character in text:
         if character not in correct:
              return False

    return True

text = input("Enter: ")
if validCharacters(text):
     print("Correct")
else:
     print("Incorrect")

0
我们可以删除所有不是 A-Z、a-z 或 0-9 的字符,然后检查剩余字符串的长度。如果长度大于 0,则表示存在不属于上述字符集的字符:
import re
text = input("Enter: ")
result = re.sub("[A-Za-z0-9]", '', text)
if len(result) == 0:
    print("Success")
else:
    print("Failure")

结果:

abcDEF123 -> Success
hello! -> Failure

0

你可以用许多不同的方法来实现它,我会按照以下方式利用 set

import string
correct = {char for char in string.ascii_letters + string.digits}
def is_correct(text):
    return {char for char in text}.issubset(correct)
print(is_correct('letters123')) # True
print(is_correct('???')) # False
print(is_correct('\n')) # False

我只是检查所给文本中的字符组成的set是否为所有合法字符的set的子集。请记住,这总是处理整个文本,从性能角度来看不是最好的方法(因为您可能会在找到第一个非法字符后结束检查),但除非您需要处理非常长的文本或在非常短的时间内处理,否则这不应该是问题。


-1

您可以使用正则表达式匹配来检查字符串是否仅包含字母和数字。

 import re
 text = input("enter:")
 regex = r"([0-9a-zA-Z]+)"

 match = re.match(regex, string)

 if match != None:
    print("success")

1
一个普通的 re.match 调用允许字符串末尾有无效字符,只要你以有效字符开头。你需要在模式中使用 $(显式匹配字符串的结尾)或使用 re.fullmatch - Blckknght

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接