python - Python 中的正则表达式匹配

标签 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'):
...     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/

相关文章:

python - "new text"标签随机出现在 Plotly 图中

python - SMTP 直接到主机的 MX 记录

python - 将 RGB 数组乘以颜色变换矩阵进行矢量化,用于图像处理

Python使用正则表达式从文本中提取数字

c# - XX + XX 的正则表达式

python - 执行大点/张量点积同时仅保留对角线条目的最有效方法

python - 无法在 Windows cmd 中添加 Python

python - 匹配 re.compile 中的单个关键字,该关键字具有关键字列表

c# - 使用反斜杠作为模式终止符的正则表达式

regex - 匹配除指定字符串之外的所有内容