我正在使用 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.26206 e+07}") 然后它给出 ['8.26206e+07'] 所以模式匹配第二个数字但我不明白为什么它不匹配两个同时。
请您参考如下方法:
您通过滥用 . 匹配任何字符但实际上并不需要它并使用捕获组 () 而没有真正使用它,使您的正则表达式稍微过于复杂。
对于您的模式,您正在寻找一个科学记数法中的数字,该数字的前后都必须恰好有一个字符。
{8.25e+07|8.26206e+07}
[--------]
在 re.findall 从头开始遍历您的字符串后,它会找到您定义的模式,然后删除 { 和 | 因为您的捕获组 (..) 并将其保存为匹配项。然后继续,但只剩下 8.26206e+07}。那现在不满足您的模式,因为您的第一个 . 缺少一个“任何”字符,并且找不到进一步的匹配项。请注意,findall 仅查找非重叠匹配项[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 = "[0-9]+\.[0-9]+[eE][-+]?[0-9]+"
如果您稍后需要再次引用特定的捕获组,捕获组会非常有用,但您手头的任务不需要它们。
[1] https://docs.python.org/2/library/re.html?highlight=findall#re.findall
