1

请帮助我发现这是否是 Python (2.6.5) 中的错误,是我编写正则表达式的能力,还是我对模式匹配的理解。

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

我正在尝试解析 Yubikey 令牌,允许使用可选的附加功能。

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

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

但是,如果我让第一组不贪婪:

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

它成功了。

所以,好的,它正在工作,但我原以为这两个正则表达式之间最终结果的唯一区别是性能。

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

我错过了什么?


这是我正在测试的两个字符串。

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

"vvbrentlnccnhgfgrtetilbvckjcegblehfvbihrdcui"

带有可选的附加功能(到目前为止还没有失败;实际的选项卡在此处显示为“_”):

"_!_8R5Gkruvfgheufhcnhllchgrfiutujfh_"
"_!1U4Knivdgvkfthrd_brvejhudrdnbunellrjjkkccfnggbdng_"

我尝试使用 Alex Martelli 的建议来重现它,并且它在原始 Python 环境中不会失败,所以我将重新访问我的代码(我实际上是在 yubikey-python 上进行黑客攻击);我会在一天左右回来报告。


我向大家道歉。我无法重现该问题。getpass当它发生时,我正在通过;读取输入。我怀疑意外的外键击中了。

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

很抱歉。

4

2 回答 2

3

我建议将yubikey-python用于 Python 与 yubikey 的接口——但是,这是一个侧面(并且严格来说是实用的)问题;-)。

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

问题是,我无法重现该问题——我手头没有 yubikey,并且此文件中的测试显示两个 RE 的匹配/不匹配行为之间没有差异。

您能否发布几个失败的示例(一个匹配而另一个不匹配),最好通过编辑您的问题,以便我可以重现问题并尝试将其减少到最低限度?听起来可能存在 RE 错误,但如果没有可重现的案例,我无法检查它是否以及何时修复、已报告或什么。谢谢!

编辑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>
>>> 

即,匹配在这两种情况下都会成功,因为它应该 - 这与 OP 使用的 2.6.5 Python 版本完全相同。OP,请在您的平台上显示这个简单命令序列的结果,并准确告诉我们平台是什么,因为它看起来像一个奇怪的平台相关错误......谢谢!

于 2010-08-01T16:12:03.430 回答
0

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

(以下“解决方案”不适用,但问题仍然没有表明正在执行不区分大小写的匹配,所以我将保留它。)

您的问题是带有可选附加项的字符串中也包含大写字母,而您的正则表达式只允许使用小写字母。将 a 粘贴(?i)在前面或正则表达式上,它工作得很好。

于 2010-08-01T17:23:32.503 回答