我有一个关于正则表达式的问题。当使用或
构造
$ 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在regex匹配中使用回溯,让它在接受字符串后继续搜索应该不是很难。但这会破坏正则表达式的通常行为。
编辑2:
这在 Perl 中是可能的。请参阅下面@Qtax 的回答。
最佳答案
我认为这是不可能的。 docs对于 re.finditer
状态:
Return an iterator yielding MatchObject instances over all non-overlapping matches for the RE pattern in string
(重点是我的)
在回答你关于为什么空字符串在其他地方不匹配的其他问题时,我认为这是因为字符串的其余部分已经在其他地方匹配并且 finditer
只给出匹配 匹配的非重叠模式(参见第一部分的答案;-)。
关于python - Python 中的正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14742355/