【问题标题】:easy way to determine if a string CAN'T be a valid regex确定字符串是否不能是有效正则表达式的简单方法
【发布时间】:2011-04-14 04:57:18
【问题描述】:

我有一个配置文件,用户可以指定部分,然后在这些部分中他们可以指定正则表达式。我必须解析这个配置文件并将正则表达式分成不同的部分。

有没有一种简单的方法可以将正则表达式与节标题分隔开?我只是想标准

[部分] 正则表达式1 正则表达式2

但我刚刚意识到 [section] 是一个有效的正则表达式。所以我想知道是否有一种方法可以格式化节标题,以便它只能被理解为节标题而不是正则表达式。

【问题讨论】:

    标签: python regex parsing delimiter


    【解决方案1】:

    有无数种方法可以制作无效的正则表达式,但首先想到的是

    *section*
    

    您不能在正则表达式的开头使用量词 (*)。

    (另一个*只是为了满足我对对称性的痴迷。)

    【讨论】:

    • 不错的简单解决方案。无论如何* 更好,因为我可以将.strip('*') 去掉,而不必添加虽然稍微复杂一点的.strip('[]')
    • 请不要用“在行首用*来区别正则表达式”这种奇葩的设计来编造自己怪异的小配置格式。使用 XML 或 JSON 或 Lua;不要用另一种不必要的自定义文件格式乱扔世界。
    • 所以当我想要做的事情可以用一条简单的线来完成时,我宁愿使用一种尴尬的 xml 格式
    【解决方案2】:

    我不知道你的问题域,所以我不知道你期望什么形式的正则表达式,但在我看来你应该保持你的部分格式不变。以 [ 开头并以 ] 结尾且中间没有方括号的正则表达式是非常不寻常的。它只能匹配单个字符。因此,保留部分标题不变。严格来说,它们是有效的正则表达式,但它们可能不是有趣的正则表达式。

    另外,为什么不使用标准库中的ConfigParser,让它为你解析呢?

    【讨论】:

    • 我考虑过使用 ConfigParser,但我的选项是键值对。虽然我可以解决这个问题,但我需要保持该部分下选项的顺序。我意识到有使用ordered_dict的python3.0解决方案,但我需要它在2.6.5下工作。当我可以自己编写时,使用自定义或未来模块并不是那么复杂。
    【解决方案3】:

    有一些简单的方法,但它们都需要更改格式:

    1. 使用缩进,类似于 Python 源代码的解释方式。前导空格需要特殊处理,例如"(?: )abc" 而不是 "abc"。
    2. 使用 INI 格式,其中一个部分中的每个项目都需要一个名称=值对。
    3. 使用某种列表语法。 ast.literal_eval 会很有帮助。

      section1 = [
        "regex 1",
        "2",
        "3",
      ]
      section2 = ["..."]
      

    首先,不要发明自己的格式,或尽可能使其接近已知格式。第三个是 Python 语法的一个子集,例如,您甚至可以自然地使用原始字符串文字。

    JSON 或 YAML 可能对您有用。

    【讨论】:

      【解决方案4】:

      正如其他人所说,请不要发明另一种配置格式。使用 Python 标准库的 ConfigParser,它将能够完全按照您所展示的那样解析 [section] 符号。

      编辑:allow_no_value 选项允许您只有一个条目,而不是键/值对。并且默认的dict类型是OrderedDict,所以会保持顺序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-08
        • 1970-01-01
        • 1970-01-01
        • 2010-10-05
        • 2017-02-03
        相关资源
        最近更新 更多