【问题标题】:Python regex - get all values from CSS declarationPython regex - 从 CSS 声明中获取所有值
【发布时间】:2023-04-10 09:03:01
【问题描述】:

我正在用 Python 开发一个简单的 CSS 解析器。现在我想从这个字符串中提取所有值:"1px solid rgb(255, 255, 255)"。现在我的模式(不起作用)是:"\S+[^rgb]+"。当我将它与字符串 "1px solid rgb(255, 255, 255)" 一起使用时,我得到以下信息:

...
>>> re.findall("\S+[^rgb]+", string)
("1px solid", "rgb(255, 255, 255)")

我希望它是

("1px", "solid", "rgb(255, 255, 255)")

附言 另外,有没有更好的方法来解析 CSS 声明?目前我的模式是"[\s]?(\S+)[\s]?:[\s]?(.+)[\s]?;"。解析"color: red;" 给了我:

("color", "red")

【问题讨论】:

    标签: python css regex parsing


    【解决方案1】:

    好的。我让它工作(我希望)。 Here 是最终代码。


    编辑

    经过漫长而无聊的手册阅读后,我终于让它正常工作: "rgb\([^)]*\)|\S+"

    【讨论】:

    • 我不明白你为什么重复 rgb() 表达式,并且前后都有那些 .'s。但是,是的,对于您的情况,一次匹配一个令牌肯定更容易。出于好奇,我确实尝试过更灵活的表达方式,但我的努力失败了:stackoverflow.com/questions/19600204/…
    • @sdanzig,我重复 rgb 两次以使其匹配 rgb(...) beforeafter 其他文本(如 "solid", "1px")跨度>
    【解决方案2】:

    你可以试试这个:

    (\S+)[ ]+(?:(\S+)[ ]+)?(rgb\([^)]+\))
    

    http://regex101.com/r/vA4kH1

    编辑:无论您尝试做什么,这可能都不是处理它的正确方法,因为 CSS 语法可能是不可预测的。你可以使用 tinycss,Python CSS 解析器来做一些更理智的事情:

    http://pythonhosted.org/tinycss/

    最后一次编辑...

    根据您的解决方案,您正在执行 findAll,它将它们分别放在一个数组中。您只需要 rgb() 一次,忽略空间。这应该适用于价值模式,它比你所拥有的更干净。另请注意,您不想使用“。”对于您的 rgb() 表达式。如果您在同一行上有 rgb() 1px rgb() ,则正则表达式默认是贪婪的......它会尽可能多地匹配。试试这个:r"(rgb([^)]+))|(\S+))"

    【讨论】:

    • 我不确定它应该如何工作。它只是从文本中提取所有(num, num, num)
    • 哦,我以为你的意思是数值中的值。示例字符串的“值”到底是什么意思?
    • 哦,对不起。我的错。请检查我修改后的答案,我写了我真正需要的输出
    • 哎呀我又遇到了一个问题。当我尝试将它与字符串 "1px rgb(255, 255, 255)" 一起使用时,它会给我一个空列表。
    • 倒霉。如果我使用更多参数(例如"1px solid blah rgb(255, 255, 255)"),它会产生["solid", "blah", "rgb(255, 255, 255)"] # No '1px' here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2020-01-06
    相关资源
    最近更新 更多