【发布时间】:2010-12-01 02:50:48
【问题描述】:
什么正则表达式会在 Python 源代码中找到三引号 cmets(可能是多行)?
【问题讨论】:
什么正则表达式会在 Python 源代码中找到三引号 cmets(可能是多行)?
【问题讨论】:
Python 不是常规语言,无法使用正则表达式进行可靠解析。
如果您想要一个合适的 Python 解析器,请查看 ast 模块。您可能正在寻找get_docstring。
【讨论】:
re.findall('(?:\n[\t ]*)\"{3}(.*?)\"{3}', s, re.M | re.S)
仅捕获一行开头的三引号内的文本,并且可以在前面有空格、制表符或什么都没有,就像 python 文档字符串应该那样。
【讨论】:
a = '""" not a real triple quote """'
我发现这对我来说非常适合(与 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""")。
我从 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。
【讨论】:
我不知道这在扫描 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 上查看它的实际应用。
【讨论】: