假设我想在python 3中使用两个字符串执行某些操作,例如" A1"或" 1A"但首先检查它是否以任何一种形式存在,用户可以用两种方式键入它。 (我已经有办法检查字母是否是一封信。)
我如何以最短最简单的方式实现这一目标? 我想尝试一件事,如果失败,请在提出异常之前尝试另一件事。像这样:
x = 0
string = 'A1'
try:
x = int(string[1]) # Check that second char is a digit
# something else to check first char is a letter
else try:
x = int(string[0]) # Check that first char is a digit
# something else to check second char is a letter
except:
print('Was in neither form')
答案 0 :(得分:4)
您可以使用循环:
for i in range(1, -1, -1):
try:
string[i] = int(string[i])
except ValueError:
pass
else:
break
else:
print('Was in neither form')
如果任一转换成功,则循环将被break
打破。如果您没有使用break
,则else
循环上的for
套件会被执行。
但是,您不能分配字符串索引,因为它们是不可变的。更好的选择是使用正则表达式:
import re
valid_pattern = re.compile('^(?:\d[A-Z]|[A-Z]\d)$')
def is_valid(string):
return valid_pattern.match(string) is not None
答案 1 :(得分:0)
您可以创建一个辅助工具来减少嵌套:
def letter_and_digit(identifier):
a, b = identifier
try:
return a, int(b)
except ValueError:
return b, int(a)
try:
letter, digit = letter_and_digit(string)
assert letter.isupper()
except:
print('Was in neither form')
正则表达式也有效,但可能有点过分:
import re
LETTER_DIGIT_PAIR = re.compile('^(?=.?([A-Z]))(?=.?([0-9]))..$')
letter, digit = LETTER_DIGIT_PAIR.match('A1').groups()
答案 2 :(得分:0)
对于多样性,这种方法不使用try / except。它只是验证string
只有一个数字和一个字母:
if not (sum(c.isdecimal() for c in string) == 1 and sum(c.isalpha() for c in string) == 1):
print('Was in neither form')