如何检查字符串是否为rgb十六进制字符串

时间:2013-11-28 22:17:54

标签: python string function hex block

我正在尝试创建校对命令控制台输入的方法,并检查以确保该字符串是rgb十六进制字符串。 (例如:#FAF0E6)目前我正在尝试:除了:阻止。

def isbgcolor(bgcolor):
    #checks to see if bgcolor is binary
    try:
        float(bgcolor)
        return True
    except ValueError:
        return False

我还尝试使用.startswith('#')。我已经看到了如何用Java编写这个函数的例子,但我仍然是初学者和Python我所知道的。帮助

3 个答案:

答案 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,以便更容易辨别正则表达式。之后只检查其他字符是否符合正则表达式检查中允许的字符。