相关疑难解决方法(0)

为什么这需要很长时间才能匹配?这是一个错误吗?

我需要匹配Web应用程序中的某些URL,即/123,456,789编写此正则表达式以匹配模式:

r'(\d+(,)?)+/$'
Run Code Online (Sandbox Code Playgroud)

我注意到它似乎没有评估,即使在测试模式几分钟后:

re.findall(r'(\d+(,)?)+/$', '12345121,223456,123123,3234,4523,523523')
Run Code Online (Sandbox Code Playgroud)

预期的结果是没有匹配.

但是,此表达式几乎立即执行(请注意尾部斜杠):

re.findall(r'(\d+(,)?)+/$', '12345121,223456,123123,3234,4523,523523/')
Run Code Online (Sandbox Code Playgroud)

这是一个错误吗?

python regex performance state-machine

50
推荐指数
3
解决办法
4814
查看次数

正则表达式实现细节

我回答的一个问题让我想知道:

如何在Python中实现正则表达式?那里有什么样的效率保证?实施是"标准",还是可以改变?

我认为正则表达式将作为DFA实现,因此非常有效(最多需要对输入字符串进行一次扫描).Laurence Gonsalves提出了一个有趣的观点,即并非所有Python正则表达式都是常规的.(他的例子是r"(a +)b\1",它匹配a的一些数量,ab,然后是与之前相同数量的a).使用DFA显然无法实现这一点.

那么,重申一下:Python正则表达式的实现细节和保证是什么?

如果有人可以给出某种解释(根据实现),为什么正则表达式"cat | catdog"和"catdog | cat"导致字符串"catdog"中的搜索结果不同,这也是很好的.在我之前提到的问题中提到过.

python regex

13
推荐指数
2
解决办法
5917
查看次数

非常慢的正则表达式搜索

我不确定我是否完全理解以下正则表达式搜索的内容:

>>> import re
>>> template = re.compile("(\w+)+\.")
>>> target = "a" * 30
>>> template.search(target)
Run Code Online (Sandbox Code Playgroud)

search()呼叫需要几分钟才能完成,CPU使用率达到100%.对于2.7.5和3.3.3 Python版本,该行为都是可重现的.

有趣的事实是,如果字符串的长度小于20-25个字符,那么很快就会search()返回.

怎么了?

python regex string performance

11
推荐指数
2
解决办法
939
查看次数

给定正则表达式的最差输入

我想在我的代码库中自动测试正则表达式.

我想防止(a+)+邪恶的正义与他们的亲属.

为此,我正在寻找一种方法或现有的库,为给定的正则表达式和引擎生成"最坏情况"输入(基于NFA和DFA的引擎都在范围内).

当然,正则表达式是一种强大的语言,很明显[计算]难以找到任意正则表达式的最差输入,尤其是.如果使用反向引用,也许它甚至可能是不可判定的.

对于我的用例,我很好找到可怕的输入(而不是最坏的可能),但很短.

regex algorithm analysis performance-testing

10
推荐指数
1
解决办法
602
查看次数