我正在使用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']
,因此模式与第二个数字相匹配,但我不明白为什么它不能同时匹配。
答案 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]+)"
应该有效