我试图创建一种校对命令控制台输入的方法,并检查以确保该字符串是一个rgb十六进制字符串.(例如:#FAF0E6)目前我正在尝试:除了:阻止.
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个字符的十六进制字符串(但大多数使用#
-prefixed十六进制RGB的数据格式也是如此),甚至是16个字符的字符串.如果要添加长度检查,可以添加.是规则== 6
还是in (3, 6)
或% 3 == 0
?我不知道,但如果你有一个你想添加的规则,大概就是你这样做.
如果你开始使用parse_bgcolor
,你会发现bytes
当你真正想要0-65535的3个值时,它会给你一个0到0的6个值.你可以手动组合它们,或者你可以将每个双字符对解析为一个数字(例如,用int(pair, 16)
),或者你可以输入bytes
你已经拥有的6个字符,比如说struct.unpack('>HHH')
.一旦你确切知道自己想做什么,一旦你需要做什么就很容易.
最后,如果您正在尝试解析CSS或HTML,那么类似于red
或者rgb(1, 2, 3)
也是有效颜色.你需要处理那些吗?如果是这样,你需要比这更智能的东西.首先要做的是查看您要解析的内容的规范,并制定转换为代码所需的规则.然后你可以编写代码.
以下内容将匹配十六进制RGB字符串:
import re _rgbstring = re.compile(r'#[a-fA-F0-9]{6}$') def isrgbcolor(value): return bool(_rgbstring.match(value))
仅True
当#
传入以后跟正好6个十六进制数字开头的字符串时,才会返回.
演示:
>>> isrgbcolor('#FAF0E6') True >>> isrgbcolor('#FAF0') False >>> isrgbcolor('FAF0E6') False >>> isrgbcolor('#NotRgb') False
如果您还想支持3位CSS格式,请更新模式:
_rgbstring = re.compile(r'#[a-fA-F0-9]{3}(?:[a-fA-F0-9]{3})?$')
这匹配哈希后跟3个十六进制数字,加上可选的3个额外数字.