我正试图从一个包含自由文本的文件中捕获代码和堆栈跟踪。这个想法是从普通英语句子中对代码进行分类。
这些是迄今为止捕获不同模式的正则表达式。
[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 (&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):
的响应