【问题标题】:regex for triple quote三引号的正则表达式
【发布时间】:2010-12-01 02:50:48
【问题描述】:

什么正则表达式会在 Python 源代码中找到三引号 cmets(可能是多行)?

【问题讨论】:

    标签: python regex


    【解决方案1】:

    Python 不是常规语言,无法使用正则表达式进行可靠解析。

    如果您想要一个合适的 Python 解析器,请查看 ast 模块。您可能正在寻找get_docstring

    【讨论】:

    • +1:问题没有使用正则表达式的有效解决方案,只有半途而废的黑客。
    • 我相信正则表达式足够强大,可以做到这一点。但是为此类任务构建适当的正则表达式很难,因此使用内置的 python 解析器是更可靠的解决方案。
    • 你有那个链接吗? '无法使用正则表达式进行可靠解析'。哪些语言可以?
    • 几乎不可读的理论摘要:en.wikipedia.org/wiki/Regular_language。大多数编程语言都不是,但是现代正则表达式具有远远超出传统正则语言匹配的扩展。然而,Python 的语法仍然过于复杂,无法使用正则表达式。
    【解决方案2】:
    re.findall('(?:\n[\t ]*)\"{3}(.*?)\"{3}', s, re.M | re.S)
    

    仅捕获一行开头的三引号内的文本,并且可以在前面有空格、制表符或什么都没有,就像 python 文档字符串应该那样。

    【讨论】:

    • 这个怎么样:a = '""" not a real triple quote """'
    • 为什么不是真正的三引号?格式是否丢失了什么?
    • 我想也可以使用非常相似的正则表达式来获取单引号(很容易扩展给定的示例),我只是认为将单个正则表达式填充到难以理解的程度是没有意义的。
    • 因为它在一个简单的引号内......所以它是字符串文字的一部分。
    • 这是一个原始字符串吗,bobince?
    【解决方案3】:

    我发现这对我来说非常适合(与 TextMate 一起使用):

    "{3}([\s\S]*?"{3})
    

    我想从库中删除所有 cmets,这会处理三引号 cmets(单行或多行,无论它们从何处开始)。

    对于散列 cmets(更容易),这很有效:

    #.*$
    

    我将这些与 TextMate 一起使用,后者使用 K. Kosako 的 Oniguruma 正则表达式库 (http://manual.macromates.com/en/regular_expressions)

    【讨论】:

    • 请注意,弱重复 (*?) 对于仅匹配三引号字符串是可靠的,但如果您从中构建更大的模式,则会有风险。例如。 \("""[\s\S]*?"""\) 并不意味着括号中的一个三引号字符串 - 它也将匹配 ("""1st string""" whatever... """2nd string""")
    【解决方案4】:

    我从 Tim Peters 那里找到了这个(我想):

    pat = """
        qqq
        [^\\q]*
        (
        (   \\\\[\000-\377]
            |   q
            (   \\\\[\000-\377]
            |   [^\\q]
            |   q
            (   \\\\[\000-\377]
                |   [^\\q]
            )
            )
        )
        [^\\q]*
        )*
        qqq
    """  
    pat = ''.join(pat.split(), '')  
    tripleQuotePat = pat.replace("q", "'") + "|" + pat.replace('q', '"')  
    

    但是,正如 bobince 所说,单独的正则表达式似乎并不是解析 Python 代码的正确工具。
    所以我选择了标准库中的 tokenize

    【讨论】:

      【解决方案5】:

      我不知道这在扫描 Python 代码时是否公平,但这似乎与孤立的 Python 字符串匹配。

      ^(\"([^\"\n\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*\"|'([^'\n\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*'|\"\"\"((?!\"\"\")[^\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*\"\"\")$
      

      转义不是标准的Python;这是我从一个项目中剪切粘贴的东西。在regex101.com 上查看它的实际应用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-02
        • 1970-01-01
        • 2015-03-24
        • 2015-12-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多