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

2024-05-11 00:42:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一种方法来校对命令控制台输入,并检查以确保字符串是一个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。帮忙吗?在


Tags: to方法字符串命令returndefrgbblock
3条回答

通常,查看字符串是否与某个简单格式匹配的最佳方法是实际尝试解析它。(尤其是如果您只是检查以便在有效的情况下可以解析它,如果无效则打印错误。)那么,让我们这样做。在

标准库中充满了各种有用的东西,因此总是值得搜索的。如果您想解析一个十六进制字符串,首先出现的是^{}。我们要取消激活第一个#字符之后的所有内容。所以:

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还是{}还是{}?我不知道,但如果你想增加一条规则的话,你应该知道。在

如果你开始使用parse_bgcolor,你会发现它给你一个bytes,有6个0-255的值,而你真正想要的是3个0-65535的值。您可以手动组合它们,也可以将每个两个字符对解析为一个数字(例如,用int(pair, 16)),也可以将已有的6个字符bytes输入,比如struct.unpack('>HHH')。一旦你明确知道你想做什么,你需要做的事情就很容易了。在

最后,如果您试图解析CSS或HTML,像red或{}这样的颜色也是有效的。你需要处理这些吗?如果是这样的话,你需要比这更聪明的东西。要做的第一件事是查看规范中要解析的内容,并找出需要转换为代码的规则。然后你就可以写代码了。在

以下内容将匹配十六进制RGB字符串:

import re

_rgbstring = re.compile(r'#[a-fA-F0-9]{6}$')

def isrgbcolor(value):
    return bool(_rgbstring.match(value))

如果传入的字符串以#开头,后跟6个十六进制数字,则只返回True。在

演示:

^{pr2}$

如果还想支持3位数的CSS格式,请更新模式:

_rgbstring = re.compile(r'#[a-fA-F0-9]{3}(?:[a-fA-F0-9]{3})?$')

这将匹配一个哈希值,后跟3个十六进制数字,外加一个可选的3个额外数字。在

这似乎是最简单的方法。此正则表达式将注意到P不属于十六进制。在

import re
from pprint import pprint

hex = '#f8Ed90P'

pprint(re.findall('[^#0-9a-fA-F]', hex))

…所以如果re.findall的结果中有什么问题,那就是你的十六进制结构有问题。在

此代码导致:

^{pr2}$

这段代码有一个缺陷,哈希表可以在任何地方,这当然是不对的。在

您可能只需要检查字符串开头的哈希表,以便更容易识别正则表达式。然后只检查其他字符是否符合正则表达式检查中允许的字符。在

相关问题 更多 >