Python正则表达式模式在re.compile中的最大长度?

Python正则表达式模式在re.compile中的最大长度?,python,regex,maxlength,Python,Regex,Maxlength,我尝试用Python3中的re.compile编译一个大模式 我试图编译的模式由500个小词组成(我想从文本中删除它们)。问题是它在大约18个单词后停止了模式 Python不会引发任何错误 我所做的是: stoplist = map(lambda s: "\\b" + s + "\\b", stoplist) stopstring = '|'.join(stoplist) stopword_pattern = re.compile(stopstring) stopstring是可以的(所有的单

我尝试用Python3中的
re.compile
编译一个大模式

我试图编译的模式由500个小词组成(我想从文本中删除它们)。问题是它在大约18个单词后停止了模式

Python不会引发任何错误

我所做的是:

stoplist = map(lambda s: "\\b" + s + "\\b", stoplist)
stopstring = '|'.join(stoplist)
stopword_pattern = re.compile(stopstring)
stopstring是可以的(所有的单词都在里面),但是模式要短得多。它甚至停在一个词的中间! 正则表达式模式是否有最大长度

考虑这个例子:

import re
stop_list = map(lambda s: "\\b" + str(s) + "\\b", range(1000, 2000))
stopstring = "|".join(stop_list)
stopword_pattern = re.compile(stopstring)
如果您尝试打印该图案,您将看到如下内容

>>> print(stopword_pattern)
re.compile('\\b1000\\b|\\b1001\\b|\\b1002\\b|\\b1003\\b|\\b1004\\b|\\b1005\\b|\\b1006\\b|\\b1007\\b|\\b1008\\b|\\b1009\\b|\\b1010\\b|\\b1011\\b|\\b1012\\b|\\b1013\\b|\\b1014\\b|\\b1015\\b|\\b1016\\b|\\b1017\\b|\)
这似乎表明模式是不完整的。然而,这似乎只是
重新编译
对象的
\u repr\u
和/或
\u str\u
方法的一个限制。如果您尝试对模式的“缺失”部分执行匹配,您将看到它仍然成功:

>>> stopword_pattern.match("1999")
<_sre.SRE_Match object; span=(0,4), match='1999')
停止字模式匹配(“1999”)
你能发布一个完整的工作示例程序吗?这现在不可能重现。我想你把
stopword\u模式的字符串表示法与它实际上在内部存储的模式混淆了。用500个项目进行替换是一个非常糟糕的主意。@great:Python re模块的工作方式与你想的不一样。现代语言(Perl、Python、PHP、Java…)中使用的大多数正则表达式引擎都不会生成DFA。主要原因是为了更好地控制正则表达式引擎搜索字符串的方式,减少编译时间,并提供DFA正则表达式引擎无法(或没有意义)的功能(反向引用、原子分组、非贪婪量词、回溯…)。这种选择的反作用是,这些引擎的工作方式更为愚蠢,在某些情况下搜索速度较慢。@格里菲:尤其是它们不能并行工作。为了加速研究,其中一些人在引擎正常运行之前有一个优化阶段(即:字符串逐个字符,模式逐个标记),J.Friedl称之为“传输”,例如,在此之前,在字符串中使用快速算法搜索模式文字字符串的位置,但这并不总是可能的,我怀疑re模块是否有许多这样的功能。但是,生成DFA的正则表达式引擎始终存在,并且与lex、MySQL、egrep…一起使用。模式应包含他正在查找的完整字符串。(这是在Python2.6和3.1中,其中编译的正则表达式似乎没有自定义的
\uuuu str\uuuu
\uuu repr\uuuu
方法。从那时起,它可能已经改变了。)很高兴知道。上述内容在3.4中进行了测试;我可以确认,至少在2.6中,
object.\uuuu repr\uuu
用于输出通用实例字符串。