【发布时间】:2020-02-16 17:52:25
【问题描述】:
我是 Regex 的初学者,所以我通过解决我能找到的所有练习来不断练习。在其中之一中,我需要使用 Regex 和 Python 从 HTML 源代码中提取所有十六进制代码。根据练习,发现 Hex 代码的规则是:
- 以#开头
- 有 3 位或 6 位数字
- 每个数字都在 0-F 范围内(字符串不区分大小写)
示例输入是这样的:
#BED { color: #FfFdF8; background-color:#aef; font-size: 123px; background: -webkit-linear-gradient(top, #f9f9f9, #fff); } #Cab { background-color: #ABC; border: 2px dashed #fff; }
想要的输出是:
#FfFdF8 #aef #f9f9f9 #fff #ABC #fff
#BED 和 #Cab 将被省略,因为它们不是十六进制颜色。
我试过这段代码,解决了这个问题:
import re
text = """
#BED
{
color: #FfFdF8; background-color:#aef;
font-size: 123px;
background: -webkit-linear-gradient(top, #f9f9f9, #fff);
}
#Cab
{
background-color: #ABC;
border: 2px dashed #fff;
} """
r = re.compile(r'#[0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}')
a = r.findall(text)
print(a)
得到的输出:
['#BED', '#FfF', '#aef', '#f9f', '#fff', '#Cab', '#ABC', '#fff']
它工作得很好,除了它没有捕捉到 6 位代码并且它没有消除实际上不是十六进制颜色代码的两个标签。
我错了什么?我查看了其他尝试,但他们没有提供正确的答案。我正在使用 Python 3.7.4 和最新版本的 PyCharm。
【问题讨论】:
-
#BED和#CAB是有效的十六进制颜色。 -
我知道,但在这个练习中,它们是它们名字的书签。我不精通 HTML。
-
@dgw 是的,但
#BED和#CAB在该示例中不是颜色。 -
但是正则表达式无法区分。所以正则表达式也会显示这些,这不会是错误。