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

时间:2012-08-30 22:50:26

标签: python regex python-3.x

我正在开发一个需要从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>"

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

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

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

P.S。我知道找到'//'序列是否在字符串引号内可以用一个更大的正则表达式来完成。我已经尝试过并遇到了同样的问题。

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

2 个答案:

答案 0 :(得分:2)

您只需要使用原始字符串来创建正则表达式:

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

你获得它的方式,\\.|[^\\"]成为正则表达式\.|[^\"],它匹配文字点(.)或任何不是引号的内容(" )。将r前缀添加到字符串文字中,它可以按预期工作。

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

答案 1 :(得分:1)

不能处理与正则表达式匹配的引号...实际上你不能保证任何匹配的任何对(尤其是嵌套对)...你需要一个更复杂的状态机(LLVM等......)

来源:很多CS类......

还可以参阅:Matching pair tag with regex了解更详细的说明

我知道它不是你想听到的,但它基本上只是它的方式......是的,正则表达式的不同实现可以为正则表达式真正做的东西返回不同的结果