Python中贪婪与非reedy匹配

2024-05-18 13:56:48 发布

您现在位置:Python中文网/ 问答频道 /正文

请帮助我发现这是Python(2.6.5)中的一个bug,还是我编写regex的能力,还是我对模式匹配的理解。在

(我承认一个可能的答案是“升级你的Python”。)

我正在尝试解析一个Yubikey令牌,允许可选的附加值。在

当我使用此正则表达式匹配没有任何可选附加项(即,只包含与两个捕获组匹配的内容)的令牌时,匹配失败:

r'^\t?[^a-z0-9]?([cbdefghijklnrtuv1-8]{0,32})\t?([cbdefghijklnrtuv1-8]{32})\t?\r?\n?$'

但是,如果我使第一组非贪婪:

^{pr2}$

它成功了。在

所以,好吧,这是有效的,但我认为这两个正则表达式的最终结果的唯一区别是性能。在

Expresso和Regex Coach都喜欢这两种模式。在

我错过了什么?在


这是我正在测试的两条弦。在

没有可选的附加功能(可能失败的):

"vvbrentlnccnhgfgrtetilbvckjcegblehfvbihrdcui"

使用可选的附加功能(到目前为止还没有失败;实际的选项卡显示为“\”):

"_!_8R5Gkruvfgheufhcnhllchgrfiutujfh_"
"_!1U4Knivdgvkfthrd_brvejhudrdnbunellrjjkkccfnggbdng_"

我试着用Alex Martelli的建议来复制它,它在原始Python环境中不会失败,所以我将重新访问我的代码(我实际上是在用yubikey Python进行黑客攻击);我将在大约一天之后报告。在


我向大家道歉。我不能重现这个问题。当它发生时,我正在通过getpass读取输入;我怀疑是一个意外的外来击键妨碍了我。在

我要结束这个问题。如果投赞成票的人希望取消他们的投票,那是公平的。在

非常抱歉。在


Tags: 答案功能内容能力性能bugregex区别
2条回答

你是对的:仅仅从贪婪量词切换到非贪婪量词不应该导致正则表达式停止工作。它可以改变正则表达式匹配(或不匹配)的速度,它匹配多少以及在哪些组中捕获哪些部分,仅此而已。在

(下面的“解决方案”不适用,但该问题仍然不表示正在执行不区分大小写的匹配,因此我将保留它。)

您的问题是,带有可选extra的字符串中也有大写字母,而regex只允许小写字母。在前面或正则表达式上粘贴(?i),它就可以正常工作了。在

我建议使用yubikey-python来实现Python与yubikey的接口,但是,这是一个附带的问题(严格来说是实际问题;-)。在

从理论上讲,不应该出现贪婪和非贪婪之间的选择导致RE在一种情况下匹配,而在另一种情况下失败,它只会影响匹配的内容(正如您提到的性能),而不是匹配是否成功,因为REs应该为此目的进行回溯。在

问题是,我无法重现这个问题我手头没有yubikey,并且this file中的测试显示两个REs的匹配/不匹配行为之间没有差异。在

你能不能发几个失败的例子(其中一个匹配,另一个不匹配),理想的方法是编辑你的问题,这样我就可以重现这个问题,并尽量把它减少到最小程度?听起来可能有一个重新错误,但没有可复制的情况下,我不能检查它是否和何时被修复,已经报告,或什么。谢谢!在

编辑OP现在发布了一个失败的例子,但我仍然无法重现:

$ py26
Python 2.6.5 (r265:79359, Mar 24 2010, 01:32:55) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> r1 = re.compile(r'^\t?[^a-z0-9]?([cbdefghijklnrtuv1-8]{0,32})\t?([cbdefghijklnrtuv1-8]{32})\t?\r?\n?$')
>>> r2 = re.compile(r'^\t?[^a-z0-9]?([cbdefghijklnrtuv1-8]{0,32}?)\t?([cbdefghijklnrtuv1-8]{32})\t?\r?\n?$'
... )
>>> nox="vvbrentlnccnhgfgrtetilbvckjcegblehfvbihrdcui"
>>> r1.match(nox)
<_sre.SRE_Match object at 0xcc458>
>>> r2.match(nox)
<_sre.SRE_Match object at 0xcc920>
>>> 

也就是说,match在这两种情况下都能成功,这与OP使用的2.6.5python版本完全相同。OP,pls,展示一下这个简单的命令序列在你的平台上的结果,告诉我们这个平台到底是什么,因为它看起来像是一个奇怪的平台相关bug。。。谢谢!在

相关问题 更多 >

    热门问题