Python正则表达式找到所有匹配项

时间:2017-03-19 22:50:45

标签: python

我正在使用python 2.7 re库来查找以字符串形式写成科学形式的所有数字。我正在使用以下代码:

import re
y = re.findall(".([0-9]+\.[0-9]+[eE][-+]?[0-9]+).","{8.25e+07|8.26206e+07}")
print y

但是,输出仅为['8.25e+07'],而我期待的是[('8.25e+07'),(8.26206e+07)]。我一直在努力,但无法找到问题所在。如果我输入y = re.findall(".([0-9]+\.[0-9]+[eE][-+]?[0-9]+).","|8.26206e+07}"),那么它会给['8.26206e+07'],因此模式与第二个数字相匹配,但我不明白为什么它不能同时匹配。

4 个答案:

答案 0 :(得分:1)

因为findall被记录到

  

...返回字符串中pattern的所有非重叠匹配,作为字符串列表。

但是你的模式重叠:第二个匹配的前导.必须是|个字符,但是第一个匹配的尾随.已经消耗了它。 / p>

只需在正则表达式的开头和结尾删除那些未捕获的.

答案 1 :(得分:1)

通过滥用匹配任何字符但未实际需要它的.而使用捕获组()而没有真正使用它,您的正则规则略微过于复杂。

使用您的模式,您正在寻找科学记数法中的数字,该数字必须在两个前面并且后面跟着一个字符。

{8.25e+07|8.26206e+07}
[--------]

re.findall开始遍历您的字符串后,它会找到您定义的模式,然后由于您的捕获组{而丢弃|(..)并保存作为一个匹配。然后它继续但只剩下8.26206e+07}。这现在不能满足您的模式,因为它缺少您的第一个.的一个“任意”字符,并且找不到进一步的匹配。请注意,findall仅查找non-overlapping matches [1]。

为了说明,请通过复制分隔符|来更改输入字符串:

>>> p = ".([0-9]+\.[0-9]+[eE][-+]?[0-9]+)."
>>> s = "{8.25e+07||8.26206e+07}"
>>> print(re.findall(p, s))
['8.25e+07', '8.26206e+07']

为了满足您的两个.,您需要在两个数字之间使用两个分隔符。

我会在您的模式中更改两件事,(1)删除.和(2)删除您的捕获组( ),您不需要它:< / p>

p = "[0-9]+\.[0-9]+[eE][-+]?[0-9]+"

如果您需要稍后再次参考特定的捕获组,捕获组可能非常有用,但您手头的任务不需要它们。

[1] https://docs.python.org/2/library/re.html?highlight=findall#re.findall

答案 2 :(得分:0)

我认为你有额外的点。 试试这个

import re
y = re.findall("([0-9]+\.[0-9]+[eE][-+]?[0-9]+)","{8.25e+07|8.26206e+07}")
print (y)

答案 3 :(得分:0)

使用正则表达式进行匹配时。默认模式是查找所有非重叠匹配项。使用末尾和开头的点,使它们重叠。

"([0-9]+\.[0-9]+[eE][-+]?[0-9]+)"

应该有效