Python-Regex的工作方式因实现而异



我正在开发一个文件解析器,该解析器需要从JavaScript代码中剪切注释。问题是它必须是智能的,这样它就不会把字符串中的'//'序列作为注释的开始。我有以下想法:

遍历行。首先查找'//'序列,然后查找所有在行中用引号('")包围的字符串,然后遍历所有字符串匹配项,以检查'//'序列是在其中一个字符串内部还是外部。如果它在他们之外,很明显,这将是一个恰当的评论开始。

当在以下行测试代码时(当然是更大的js文件的一部分):

document.getElementById("URL_LABEL").innerHTML="<a name="link" href="http://"+url+"" target="blank">"+url+"</a>";

我遇到了问题我的正则表达式代码:

re_strings=re.compile("""   "
                            (?:
                            \.|
                            [^\"]
                            )*
                            "
                            |
                            '
                            (?:
                                [^\']|
                                \.
                            )*
                            '
                            """,re.VERBOSE);

for s in re.finditer(re_strings,line):
            print(s.group(0))

在python 3.2.3(和3.1.4)中,返回以下字符串:

"URL_LABEL"
"<a name="
" href="
"+url+"
" target="
">"
"</a>"

这显然是错误的,因为"不应该退出字符串。我已经调试我的正则表达式很长时间了,它不应该在这里退出。因此,我使用了RegexBuddy(与Python兼容)和Python regex测试仪http://re-try.appspot.com/以供参考。最奇怪的是它们都返回相同的、正确的结果,而不是我的代码,即:

"URL_LABEL"
"<a name="link" href="http://"
"" target="blank">"
"</a>"

我的问题是这些差异的原因是什么?我忽略了什么我是Python和正则表达式的初学者,所以答案可能很简单。。。

附言:我知道如果'//'序列在字符串引号内,可以用一个更大的正则表达式来完成。我已经试过了,也遇到了同样的问题。

p.p.S我想知道我做错了什么,为什么我的代码和正则表达式测试应用程序的行为存在差异,而不是找到其他解析JavaScript代码的想法。

您只需要使用一个原始字符串来创建regex:

re_strings=re.compile(r"""   "
                             etc.
                             "
                        """,re.VERBOSE);

按照你的方式,\.|[^\"]变成了正则表达式.|[^"],它匹配一个文字点(.)或任何不是引号的东西(")。将r前缀添加到字符串文字中,它将按您的预期工作。

请参阅此处的演示。(我还使用了一个原始字符串来确保反斜杠出现在目标字符串中。我不知道你在测试中是如何安排的,但反斜杠显然存在;问题是它们在正则表达式中丢失了。)

无法使用正则表达式处理匹配的引号。。。事实上,您不能保证任何东西的任何匹配对(尤其是嵌套对)。。。你需要一个更复杂的状态机(LLVM等)

来源:很多CS类。。。

另请参阅:将配对标签与正则表达式匹配以获得更详细的解释

我知道这不是你想听的,但基本上就是这样。。。是的,regex的不同实现可以为regex不能真正执行的东西返回不同的结果

最新更新