Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.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_Python 3.x_Regex - Fatal编程技术网

Python正则表达式对大数据的处理永远有效

Python正则表达式对大数据的处理永远有效,python,python-3.x,regex,Python,Python 3.x,Regex,我试图捕获代码并从一个包含自由文本的文件中堆栈跟踪。这个想法是从普通的英语句子中对代码进行分类 这些是迄今为止捕获不同模式的正则表达式 [Cc][Cc]\[\\?"?\S+"?\\?\] \w+\((\\?"?(((\w)+(.|:)?)+)*\\?"?,?\s?)*\) (\w+\d*).?(?:<=?|>=?|==?|!=).* \w+\/\d.?(\d)+\s?(\(.+\))? \w+(\s|\.)?\w+\(((\w+,?\s?)?((\.)+)*)?\) (\w+\/?)

我试图捕获代码并从一个包含自由文本的文件中堆栈跟踪。这个想法是从普通的英语句子中对代码进行分类

这些是迄今为止捕获不同模式的正则表达式

[Cc][Cc]\[\\?"?\S+"?\\?\]
\w+\((\\?"?(((\w)+(.|:)?)+)*\\?"?,?\s?)*\)
(\w+\d*).?(?:<=?|>=?|==?|!=).*
\w+\/\d.?(\d)+\s?(\(.+\))?
\w+(\s|\.)?\w+\(((\w+,?\s?)?((\.)+)*)?\)
(\w+\/?)+[a-z\-]+\.?(h|cpp|c|java|py|html|css|js)\:
语句
是我程序中的一个模型,而
文本清理控制器
用于清理文本

我想知道我在这里做错了什么,因为这需要在大文件上花费很长时间

下面是我试图用tagC检测的一些示例数据

error_550_is_directory (FtpConnection *conn, const FtpFile *file)
{
    guint response = ftp_connection_send (conn,  RESPONSE_PASS_500, \"cwd %s\", file);
    if (response == 550)
    {
        g_set_error (&amp;conn-&amp;gt;error, G_IO_ERROR,  G_IO_ERROR_IS_DIRECTORY, _(\"File is a directory\"));
    }
}
下面是一个实际的英语句子

The patch gets the gist of what I want, but it looks ugly in places.

你很容易发生灾难性的回溯,通常是量词中的量词。就你而言

(\\?"?(((\w)+(.|:)?)+)*\\?"?,?\s?)*\)
                     ^^^         ^^^

此外,这个表达式看起来可以被极大地优化。

这更像是一个注释和答案

很难回答您的问题,因为您提供了两个正则表达式,并且没有样本数据

但是,我可以指出一些可能有助于提高性能的改进:

[Cc][Cc]\[\\?"?\S+"?\\?\] ===> (?i)[c]{2}\[\\?"?\S+"?\\?\]

\w+\/\d.?(\d)+\s?(\(.+\))? ===> \w+\/\d.?\d+\s?(\(.+\))?
         ^^^^---- avoid capturing repetaedly groups

\w+(\s|\.)?\w+\(((\w+,?\s?)?((\.)+)*)?\) ===> \w+[\s\.]?\w+\(((\w+,?\s?)?\.+)?\)
   ^^^^^^                   ^^^^^^^^^^
      |                          +--- this generate terrible performance
      +--- use character classes when matching once

这个正则表达式也有可怕的回溯:

\w+\((\\?"?(((\w)+(.|:)?)+)*\\?"?,?\s?)*\) 
我想你可以用
\w+\((\\?“?(\w+[.:])+\?“?,?\s?*\)

试试这些。
倒数第二个很麻烦,很可能是罪魁祸首

[Cc][Cc]\[\?”?\S+“?\\?\]
替换为
[Cc][Cc]\[\S+?\]

\w+\((\\?”?((\w)+(.:)+)*\?,?\s?*\)
替换为
\w+\((\\?)(\w+[.:)*\?,?\s?*)

(\w+\d*)。?(?:=?:=?|==?|!=)。
替换为
(\w+)。(?:[=]=?|!=)。。

\w+\/\d.(\d)+\s.(\(.+\)?
替换为
\w+\/\d.(\d+)\s.(\(.+?\)?

\w+(\s?)?\w+\((\w+,?\s?)((\)+)*)?\)
替换为
\w+([\s.])?\w+\(\w+,?\s?[.]*.[.]+)?\)


(\w+\/?)+[a-z-]+\。(h | cpp | c | java | py | html | css | js):
回复
(\w+\/?)+[a-z-]+\。(h | cpp | c | java | py html | css | js)
,<。。然后fixI用你的替换了正则表达式。仍然可以做一个体面的表现。然而,我理解我写的可怜的正则表达式。让我用新的正则表达式做进一步的调查。@akalanka很高兴看到它有所改进。性能泄漏是指在量词中包含量词的部分,如
(\)+)*?
,这会产生一个名为“灾难性回溯”的问题。因此,您可以将这个
(\)+)*?
替换为
\.*
,因为最后它生成了相同的匹配。映射文件扩展名的最后一个模式
h | cpp | c | java | py | html | css | js
给我带来了麻烦。它对我的测试用例更有效。但不是针对实际数据。文件ext(最后一个rx)只执行了2次转义,否则它将是yurs。我不理解你的意图。lIt似乎在regex中有多个文件扩展名是个坏主意。我把它改为只检查.c和.h文件。也许我必须对每个文件扩展名使用单独的正则表达式,而不是使用管道(
|
)。这只是一个想法。我没有任何证据支持我的案子。
\w+\((\\?"?(((\w)+(.|:)?)+)*\\?"?,?\s?)*\)