Python正则表达式永远适用于大数据



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

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

[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):

python代码编译模式,并根据对象中的每个句子进行匹配。有些对象具有少量的线(例如:~30(,而有些对象具有大量的线(如:>200(。

import re
import os
from models.Sentence import Sentence
from controllers.TextCleanController import TextCleanController
class SyntaxController:
"""Capture syntax in a sentence
"""
def __init__(self):
curr_dir = os.getcwd()
pattern_file_path = os.path.join(curr_dir, "data", "regex.txt")
patterns = list()
with open(pattern_file_path) as f:
patterns = [line.rstrip() for line in f]
self.all_patterns = re.compile('|'.join(pat for pat in patterns))
def findSyntax(self, sentence):
"""Find sentences that contain URL(s) and add a tag URL
Parameters
----------
sentences : obj
Sentence object
"""

tcc = TextCleanController()
sentence.set_cleaned_text(tcc.clean_sentence(sentence.get_text(), r_digit=False, r_punc=False, lem=False, stop=False))
if self.all_patterns.search(sentence.get_cleaned_text()):
if 'C' not in sentence.get_tags():
sentence.add_a_tag('C')

Sentence是我的程序中的一个模型,TextCleanController用于清理文本。

我想知道我在这里做错了什么,因为这会占用大量文件。

以下是我尝试使用标签C检测的一些示例数据。

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):的响应

最新更新