Python中的正则表达式匹配

Python中的正则表达式匹配,python,regex,Python,Regex,我有一个关于正则表达式的问题。使用或构造时 $ 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'): ...

我有一个关于正则表达式的问题。使用或构造时

$ 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。还有,对于任何形式为r1 | r2 | |…|的正则表达式,通常如何做到这一点注册护士

同样,对于*、+、和,是否可以实现这一点?构造?默认情况下:

>>> 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
第二个问题是,为什么空字符串在末尾匹配,而在其他地方不匹配,比如*和

编辑:

我想我现在意识到这两个问题都是胡说八道:正如@mgilson所说,re.finditer只返回非重叠匹配,我猜每当正则表达式接受字符串的一部分时,它就会终止搜索。因此,使用Python匹配引擎的默认设置是不可能的

虽然我想知道Python是否在正则表达式匹配中使用回溯,但让它在接受字符串后继续搜索应该不是很困难。但这将打破正则表达式的常规行为

编辑2:


这在Perl中是可能的。请参阅下面@Qtax的答案。

我认为这是不可能的。对于re.finditer状态:

返回一个迭代器,该迭代器在字符串中的RE模式的所有非重叠匹配上生成MatchObject实例

重点是我的


在回答您关于为什么空字符串在其他地方不匹配的另一个问题时,我认为这是因为字符串的其余部分已经在其他地方匹配,FindItemer只为匹配的非重叠模式提供匹配,请参见第一部分的答案;-

我只想提一下,您可以在Perl中使用以下表达式来执行这些操作:

(?:a|ab)(?{ say $& })(?!)
每当正则表达式引擎到达模式中的那个位置时,{code}构造就会执行代码。就在正则表达式之后,它会打印到目前为止的匹配内容。这个在这之后,比赛失败,使正则表达式引擎返回,并给我们下一个可能的比赛,等等

这适用于任何类型的表达式

例如:

perl -E "$_='ab'; /(?:a|ab)(?{ say $& })(?!)/"
输出:

a
ab
aaaa
aaa
aa
a
aaa
aa
a
aa
a
a
另一个例子:

perl -E "$_='aaaa'; /a+(?{ say $& })(?!)/"
输出:

a
ab
aaaa
aaa
aa
a
aaa
aa
a
aa
a
a

@回答者-如果你证明我在这一点上错了,请通知我。我很想知道这个问题的结果:当然,第二个问题很愚蠢,应该读一下文档:很酷,我以前不知道这个扩展。我想知道Python或其他语言(如Javascript)中是否存在类似的东西?我目前正在阅读Python文档,希望能找到类似的内容:@Timo,当然不是JavaScript,我所知道的任何其他语言/lib都没有这样的执行代码特性。但是一些自由行PCRE?可能允许您设置一些设置以获得与本例相同的结果。是的,在Python文档中没有找到任何与此相关的内容。我想这证明了Perl仍然是处理与正则表达式相关的任何内容的最佳工具:D@Timo-看起来可能有类似于您在模块中寻找的东西…尽管,我似乎无法让它工作。似乎overlapped=True关键字就是您想要的