Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式根据实现的不同而工作不同?_Python_Regex_Python 3.x - Fatal编程技术网

Python正则表达式根据实现的不同而工作不同?

Python正则表达式根据实现的不同而工作不同?,python,regex,python-3.x,Python,Regex,Python 3.x,我正在开发一个需要从JavaScript代码中删除注释的文件解析器。问题是它必须是智能的,这样它就不会把字符串中的'/'序列作为注释的开头。我有以下想法: 遍历行。 首先查找'/'序列,然后在行中查找所有带引号的字符串('或“),然后遍历所有字符串匹配项,以检查'/'序列是否在其中一个字符串的内部或外部。如果它在其中一个字符串的外部,很明显这将是一个正确的注释开头 在以下行测试代码时(当然是更大的js文件的一部分): document.getElementById(“URL_标签”).inner

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

遍历行。 首先查找
'/'
序列,然后在行中查找所有带引号的字符串(
'
),然后遍历所有字符串匹配项,以检查
'/'
序列是否在其中一个字符串的内部或外部。如果它在其中一个字符串的外部,很明显这将是一个正确的注释开头

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

document.getElementById(“URL_标签”).innerHTML=“”;

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

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


for s in re.finditer(re_strings,line):
            print(s.group(0))
"URL_LABEL"
"<a name=\"
" href=\"
"+url+"
" target=\"
">"
"</a>"
"URL_LABEL"
"<a name=\"link\" href=\"http://"
"\" target=\"blank\">"
"</a>"
在python 3.2.3(和3.1.4)中,返回以下字符串:

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


for s in re.finditer(re_strings,line):
            print(s.group(0))
"URL_LABEL"
"<a name=\"
" href=\"
"+url+"
" target=\"
">"
"</a>"
"URL_LABEL"
"<a name=\"link\" href=\"http://"
"\" target=\"blank\">"
"</a>"
我的问题是造成这些差异的原因是什么?我忽略了什么?我是Python和正则表达式的初学者,所以答案可能很简单

另外,我知道用一个更大的正则表达式就可以找到
'/'
序列是否在字符串引号内。我已经试过了,遇到了同样的问题


p.p.S我想知道我做错了什么,为什么我的代码和regex测试应用程序的行为有差异,而不是找到其他方法来解析JavaScript代码。

你不能用regex处理匹配的引号……事实上你不能保证任何匹配对(尤其是嵌套对)…您需要更复杂的状态机(LLVM等)

资料来源:很多CS课程

另请参见:以获取更详细的解释


我知道这不是你想听到的,但基本上就是这样……是的,不同的regex实现可以为regex不能真正做的事情返回不同的结果

你不能用regex处理匹配引号……事实上你不能保证任何匹配对(尤其是嵌套对)…您需要更复杂的状态机(LLVM等)

资料来源:很多CS课程

另请参见:以获取更详细的解释


我知道这不是你想听到的,但基本上就是这样……是的,不同的正则表达式实现可以为正则表达式不能真正执行的内容返回不同的结果

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

re_strings=re.compile(r"""   "
                             etc.
                             "
                        """,re.VERBOSE);
按照您的方式,
\.[^\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/code>将成为正则表达式,它与文字点(
)或任何非引号(
)匹配。将
r
前缀添加到字符串文字,它将按照您的意图工作


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

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

re_strings=re.compile(r"""   "
                             etc.
                             "
                        """,re.VERBOSE);
按照您的方式,
\.[^\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/code>将成为正则表达式,它与文字点(
)或任何非引号(
)匹配。将
r
前缀添加到字符串文字,它将按照您的意图工作


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

由于RegExt的性质,这是行不通的。由于regexI的性质,这是行不通的。我也参加了一些CS课程,但可能我忘了什么。据我所知,regex是一个状态机,当它遇到或试图按从左到右的顺序匹配分支时(即在Python中,我同意它在不同语言之间可能有所不同)。因此,当您查找单个带引号的字符串时,您可以编写类似于“
”(\\.[^\\”)*“
”的内容,它应该可以工作。如果遇到
\
,我看不到有任何机会对字符串中的这个正则表达式进行多重解释,它必须后跟任何其他字符,因此如果它是
,我们仍然处于
(…)*
必须以
结尾。如果我错了,请纠正我。我不知道,我认为你是对的……但我在课堂上所记得的是,你绝对不能匹配嵌套的东西(引号是主要的例子)……这对我们来说很难……实际上,你可以说“一个FOO”,“后面是0或更多的NO FOO”,“接着是一个FOO"但是你不能处理嵌套的东西,而处理转义的foos会变得相当棘手,问题的提出者实际上想要的是一个完整的解析。是的,用regex嵌套是相当困难的,而且可能需要大量的资源。我以前遇到过一个问题,Python无法完成整个文件的findall方法,所以我开始通过ugh行,并使用非正则表达式方法来判断`/`是否在引号之外。我也参加过一些CS类,但可能忘了什么。据我所知,正则表达式是一个状态机,当它遇到或试图按从左到右的顺序匹配分支时(在Python中,我同意它可以在不同语言之间变化)。因此,当您查找单个带引号的字符串时,您可以编写类似于“
”(\\.[^\\”)*“
”的内容,它应该可以工作。如果遇到
\
,我看不到有任何机会对字符串中的这个正则表达式进行多重解释,它必须后跟任何其他字符,因此如果它是
,我们仍然处于
(…)*
必须以
结尾。如果我错了,请纠正我。我不知道,我认为你是对的……但我所记得的都是a班