python正则表达式是否有理由不编译r'(\ s*)+'?

Pho*_*nix 9 python regex

我不明白为什么'(\s*)+'会出错'nothing to repeat'.同时'(\s?)+'也很好.

我发现这个问题已经有一段时间了解(例如正则表达式错误 - 没有什么可重复)但我仍然在Python 3.3.1中看到它.

所以我想知道这种行为是否有合理的解释.

实际上我想匹配一行重复的单词或数字,例如:

'foo foo foo foo'
Run Code Online (Sandbox Code Playgroud)

我想出来了:

'(\w+)\s+(\1\s*)+'
Run Code Online (Sandbox Code Playgroud)

由于第二组,它失败了:(\1\s*)+ 在大多数情况下,我可能在单词之间不会有超过1个空格,因此(\1\s?)+可行.出于实际目的,该选项也应该起作用(\1\s{0,1000})+

更新: 我想我应该补充一点,我只在python中看到过这个问题.在perl中它起作用:

`('foo foo foo foo' =~ /(\w+)\s+(\1\s*)+/) `
Run Code Online (Sandbox Code Playgroud)

不确定它是否相同,但vim也有效:

`\(\<\w\+\>\)\_s\+\(\1\_s*\)\+`
Run Code Online (Sandbox Code Playgroud)

Update2: 我发现python的另一个regex实现,据说有一天会替换当前的rege.我检查过,上述有问题的情况不会发生错误.该模块必须单独安装.它可以在这里或通过pypi 下载

Sla*_*off 6

python与此相关的问题主要是链接帖子中出现的null问题.如果你打算至少有一个角色我建议改为使用:

(\s+)+
Run Code Online (Sandbox Code Playgroud)

这就是说,它也没有什么意义,如果你问(\s*)+有这个想法+需要的东西存在,*没有.匹配?任何一种都没有多大意义,但是你可以通过说它是一个可选的匹配来解决它,这意味着如果它没有找到它继续前进,而不是将*其解释为匹配模式.

但是,如果你真的想检查Python的问题是什么,我建议玩一下范围.例如,我通过使用这两个例子来得出结论:

re.compile("(\s{1,})+")
Run Code Online (Sandbox Code Playgroud)

这很好

re.compile("(\s{0,})+")
Run Code Online (Sandbox Code Playgroud)

以同样的方式失败.

至少这意味着它不是Python中的"bug".这是一个有意识的设计决策,它作用于每个正则表达模式,这些模式在概念上属于同一个坑.我的猜测(在几个不同的环境中检查)(\s{0,})+将会可靠地失败,因为它显式重复了一个可能为null的元素.

但是,似乎有许多环境用于*指示匹配是可选的,而python不遵循此选择.这对许多情况都有意义,但偶尔会导致奇怪的行为.我认为Guido在这里做出了正确的选择,因为具有不一致的空间存在意味着你违反了泵浦引理并且你的模式不再是无环境的.

在这种情况下,它可能没那么重要,但这意味着在正则表达式中不可避免地存在无法解决的模糊性.

所以你有问题,然后你选择使用正则表达式来解决这个问题.现在你有两个问题,C'est la vie.