我有一个关于正则表达式的问题。使用or
构造时
$ python
Python 2.7.3 (default, Sep 26 2012, 21:51:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> for mo in re.finditer('a|ab', 'ab'):
... print mo.start(0), mo.end(0)
...
0 1
我们只得到一个匹配,它被认为是最左边的第一个分支,被接受。我的问题是这是否可能以及如何构造一个正则表达式,它将产生(0,1)和(0,2)。而且,通常如何对 form 中的任何正则表达式执行此操作r1 | r2 | ... | rn
。
*
同样,对于、+
和?
构造,是否有可能实现这一点?默认情况下:
>>> for mo in re.finditer('a*', 'aaa'):
... print mo.start(0), mo.end(0)
...
0 3
3 3
>>> for mo in re.finditer('a+', 'aaa'):
... print mo.start(0), mo.end(0)
...
0 3
>>> for mo in re.finditer('a?', 'aaa'):
... print mo.start(0), mo.end(0)
...
0 1
1 2
2 3
3 3
第二个问题是,为什么空字符串在末尾匹配,但在其他任何地方都不匹配*
and ?
?
编辑:
我想我现在意识到这两个问题都是无稽之谈:正如@mgilson 所说, re.finditer 只返回不重叠的匹配项,我猜每当正则表达式接受(a 的一部分)字符串时,它都会终止搜索。因此,使用 Python 匹配引擎的默认设置是不可能的。
虽然我想知道如果Python在正则表达式匹配中使用回溯,那么在接受字符串后让它继续搜索应该不是很困难。但这会破坏正则表达式的通常行为。
编辑2:
这在 Perl 中是可能的。请参阅下面@Qtax 的回答。