正则表达式在Python中匹配

时间:2013-02-07 02:05:20

标签: python regex

我对正则表达式有疑问。使用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)。此外,如何对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

第二个问题是为什么空字符串在末尾匹配,而不是像*?那样在其他任何地方匹配?

编辑:

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

虽然我想知道如果Python在正则表达式匹配中使用回溯,那么在接受字符串后继续搜索应该不是很困难。但这会破坏正则表达式的通常行为。

EDIT2:

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

2 个答案:

答案 0 :(得分:1)

我不认为这是可能的。 re.finditer状态的docs

  

返回一个迭代器,在字符串

中的RE模式的所有非重叠匹配上产生MatchObject实例

强调是我的


在回答您关于为什么空字符串与其他地方不匹配的其他问题时,我认为这是因为字符串的其余部分已在其他地方匹配,而finditer仅为非重叠提供匹配匹配的模式(参见第一部分答案; - )。

答案 1 :(得分:1)

只是想提一下,您可以使用类似的表达式在Perl中执行此类操作:

(?:a|ab)(?{ say $& })(?!)
每次正则表达式引擎到达模式中的该位置时,(?{ code })构造都会执行代码。就在你的正则表达式之后,它打印到目前为止匹配的内容。之后的(?!)使匹配失败,使正则表达式引擎回溯,并为我们提供下一个可能的匹配,依此类推。

这适用于任何表达方式。

示例:

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

输出:

a
ab

另一个例子:

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

输出:

aaaa
aaa
aa
a
aaa
aa
a
aa
a
a