Bog*_*cin 3 python regex parsing
我是正则表达式的初学者,所以我通过解决我能找到的所有练习来不断练习。在其中之一中,我需要使用 Regex 和 Python 从 HTML 源代码中提取所有十六进制代码。根据练习,发现十六进制代码的规则是:
示例输入是这样的:
Run Code Online (Sandbox Code Playgroud)#BED { color: #FfFdF8; background-color:#aef; font-size: 123px; background: -webkit-linear-gradient(top, #f9f9f9, #fff); } #Cab { background-color: #ABC; border: 2px dashed #fff; }
期望的输出是:
Run Code Online (Sandbox Code Playgroud)#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)
Run Code Online (Sandbox Code Playgroud)
获得的输出:
['#BED', '#FfF', '#aef', '#f9f', '#fff', '#Cab', '#ABC', '#fff']
它工作得很好,只是它没有捕获 6 位代码,并且没有消除实际上不是十六进制颜色代码的两个标签。
我错了什么?我查看了其他尝试,但他们没有提供正确的答案。我正在使用 Python 3.7.4 和最新版本的 PyCharm。
一方面,您可以先匹配 6 位代码,否则匹配 3 位代码将首先匹配其中的一半(因此不匹配完整的 6 位代码)。但由于您也只想匹配 CSS 属性规则,而不匹配选择器,因此先行查找;、,或):
(?i)#(?:[0-9a-f]{6}|[0-9a-f]{3})(?=[;,)])
Run Code Online (Sandbox Code Playgroud)
https://regex101.com/r/BtZaoV/2
如果您还需要能够排除组合选择器,例如#BED, foo {,您可以先行查找非{s 后跟}:
(?i)#(?:[0-9a-f]{6}|[0-9a-f]{3})(?=[^{]*})
Run Code Online (Sandbox Code Playgroud)
https://regex101.com/r/BtZaoV/3
使用不区分大小写的标志来保持干燥。(您也可以用来{3}){1,2}避免重复字符集,但这会使模式更难以阅读IMO)
| 归档时间: |
|
| 查看次数: |
2111 次 |
| 最近记录: |