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 (&conn-&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?)*\)