我正在尝试创建一种方法来校对命令控制台输入并检查以确保该字符串是 rgb 十六进制字符串。 (例如:#FAF0E6)目前我正在使用 try: except: block。
def isbgcolor(bgcolor):
#checks to see if bgcolor is binary
try:
float(bgcolor)
return True
except ValueError:
return False
我也尝试过使用 .startswith('#')。我看过如何用 Java 编写此函数的示例,但我仍然是初学者,我只知道 Python。帮忙?
请您参考如下方法:
通常,查看字符串是否匹配某种简单格式的最佳方法是实际尝试解析它。 (特别是如果您只是检查,如果有效则可以解析它,如果无效则打印错误。)所以,让我们这样做吧。
标准库中充满了各种有用的东西,因此总是值得搜索。如果你想解析一个十六进制字符串,首先出现的是binascii.unhexlify。 .我们想在第一个 # 字符之后取消所有内容。所以:
import binascii
def parse_bgcolor(bgcolor):
if not bgcolor.startswith('#'):
raise ValueError('A bgcolor must start with a "#"')
return binascii.unhexlify(bgcolor[1:])
def is_bgcolor(bgcolor):
try:
parse_bgcolor(bgcolor)
except Exception as e:
return False
else:
return True
它接受 3 个字符的十六进制字符串(但大多数使用 # 前缀的十六进制 RGB 的数据格式也是如此),甚至是 16 个字符的字符串。如果你想添加一个长度检查,你可以添加它。规则是 == 6 还是 in (3, 6) 还是 % 3 == 0?我不知道,但如果您有要添加的规则,大概会这样做。
如果您开始使用 parse_bgcolor,您会发现它给您一个 bytes,其中包含 0-255 中的 6 个值,而您真正想要的是 0-255 中的 3 个值65535。您可以手动组合它们,或者您可以将每个双字符对解析为一个数字(例如,使用 int(pair, 16)),或者您可以提供 6 个字符的 bytes 你已经进入了,比方说,struct.unpack('>HHH')。一旦您确切地知道自己想要做什么,无论您需要做什么都非常容易。
最后,如果您尝试解析 CSS 或 HTML,red 或 rgb(1, 2, 3) 也是有效的颜色。你需要处理这些吗?如果是这样,您将需要比这更聪明的东西。要做的第一件事是查看规范以了解您要解析的内容,并制定出需要转化为代码的规则。然后就可以写代码了。
