我正在尝试创建校对命令控制台输入的方法,并检查以确保该字符串是rgb十六进制字符串。 (例如:#FAF0E6)目前我正在尝试:除了:阻止。
def isbgcolor(bgcolor):
#checks to see if bgcolor is binary
try:
float(bgcolor)
return True
except ValueError:
return False
我还尝试使用.startswith('#')。我已经看到了如何用Java编写这个函数的例子,但我仍然是初学者和Python我所知道的。帮助
答案 0 :(得分:6)
以下内容将匹配十六进制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个额外数字。
答案 1 :(得分:5)
通常,查看字符串是否与某种简单格式匹配的最佳方法是实际尝试解析它。 (特别是如果您只是检查,那么您可以在有效时解析它,或者如果没有则打印错误。)所以,让我们这样做。
标准库充满了各种有用的东西,所以总是值得搜索。如果要解析十六进制字符串,首先出现的是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
,您会发现当您真正想要0-65535中的3个值时,它会为您提供一个{0}来自0到0的值bytes
。您可以手动组合它们,也可以将每个双字符对解析为一个数字(例如,使用int(pair, 16)
),或者您可以将已有的6个字符bytes
提供给,例如{ {1}}。一旦你确切知道自己想要做什么,无论你需要做什么都很容易。
最后,如果您尝试解析CSS或HTML,struct.unpack('>HHH')
或red
之类的内容也是有效颜色。你需要处理那些吗?如果是这样,你需要比这更智能的东西。首先要做的是查看您要解析的内容的规范,并制定转换为代码所需的规则。然后你可以编写代码。
答案 2 :(得分:0)
这似乎是最简单的方法。这个正则表达式会注意到P
不属于HEX。
import re
from pprint import pprint
hex = '#f8Ed90P'
pprint(re.findall('[^#0-9a-fA-F]', hex))
..所以如果re.findall
的结果中有某些内容,那么你的HEX结构会出现问题。
此代码导致:
macbook-pro:Desktop allendar$ python3 test.py
['P']
这段代码存在散列层可以在任何地方的缺陷,当然这是不对的。
您可能只想检查字符串开头的hash-deck,以便更容易辨别正则表达式。之后只检查其他字符是否符合正则表达式检查中允许的字符。