如何解决无法使用正则表达式在字符串中找到模式
我试图在 CSS
代码中提取所有代表颜色的有效十六进制值。
HEX 颜色代码规格
- 它必须以“#”符号开头。
- 它可以有 3 位或 6 位数字。
- 每个数字都在 0-F 或 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 满足十六进制颜色代码标准,但它们在给定的 CSS 中用作选择器而不是颜色代码。 所以实际的颜色代码是
#FfFdF8
#aef
#f9f9f9
#fff
#ABC
#fff
我在 python 中的尝试
import re
pattern = r'^#([A-Fa-f0-9]{3}){1,2}$'
n = int(input())
hexNum = []
for _ in range(n):
s = input()
if ':' in s and '#' in s:
result = re.findall(pattern,s)
if result:
hexNum.extend(result)
for num in hexNum:
print(num)
当我在示例输入上运行上述代码时,它没有打印任何内容。 那么我在这里做什么错了?是匹配模式吗?还是我应用的逻辑?
请有人解释一下!
解决方法
去掉锚点 ^
和 $
,因为它们只匹配整个输入行。
去掉捕获组,这样 re.findall()
将只返回整个匹配项,而不是组匹配项。使用 (?:...)
创建非捕获组,以便您可以使用 {1,2}
量词。
pattern = r'#(?:[A-Fa-f0-9]{3}){1,2}'
,
你有一个由两部分或三部分组成的问题:
- 删除 CSS 注释,这些注释通常包含看起来像代码的东西(可选,但推荐)
- 正则表达式匹配注释为
/\*.*?\*/
- 正则表达式匹配注释为
- 只看大括号内部(例如,不看选择器)
- 正则表达式匹配的花括号是
\{.*?\}
- 正则表达式匹配的花括号是
- 查找颜色代码
- 颜色代码的正则表达式为
#(?:[A-Fa-f0-9]{3}){1,2}
- 颜色代码的正则表达式为
综合起来:
import re
def color_codes(css_text):
codes = []
# remove comments
css_text = re.sub(r'/\*.*?\*/','',css_text,re.S)
# consider only {} blocks
for block in re.finditer(r'\{.*?\}',re.S):
# find color codes
codes.extend(re.findall(r'#(?:[A-Fa-f0-9]{3}){1,2}',block.group(0)))
return codes
注意:这可能不是万无一失的解决方案。为此,您希望从简单的正则表达式切换到完整的解析器。但是,如果您只需要一些快速的东西并且不介意一些边缘情况,它就足够了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。