regex – 快速算法,从大量文本中提取数千个简单模式

我希望能够有效地匹配成千上万的文本中的数千个正则表达式,因为大多数这些正则表达式都非常简单,例如:

\bBarack\s(Hussein\s)?Obama\b
\b(John|J\.)\sBoehner\b

等等

我目前的想法是尝试从每个正则表达式中提取某种最长的子字符串,然后使用Aho-Corasick匹配这些子字符串并消除大部分正则表达式,然后匹配所有剩余的正则表达式组合.谁能想到更好的东西?

最佳答案 您可以使用(f)lex生成DFA,它可以并行识别所有文字.如果存在太多通配符,这可能会变得棘手,但它适用于大约100个文字(对于4个字母的alfabet;对于自然文本可能更多).您可能希望禁止默认操作(ECHO),并仅打印匹配的行列号.

[我认为grep -F大致相同]

%{
/* C code to be copied verbatim */
#include <stdio.h>
%}

%%

"TTGATTCACCAGCGCGTATTGTC" { printf("@%d: %d:%s\n", yylineno, yycolumn, "OMG! the TTGA pattern again"  ); }


"AGGTATCTGCTTCAATCAGCG" { printf("@%d: %d:%s\n", yylineno, yycolumn, "WTF?!"  ); } 

... 
more lines
...

[bd-fh-su-z]+ {;}

[ \t\r\n]+ {;}

. {;}

%%

int main(void)
{
/* Call the lexer, then quit. */
yylex();
return 0;
}

可以使用awk或任何其他脚本语言从txt输入生成上述脚本.

点赞