使用Python中的Regex提取浮点值

时间:2015-09-29 10:35:08

标签: python regex

这是我的字符串,我正在使用Python

Memoria RAM - 1.5GB 
Memoria RAM - 1 GB

这是我用来提取值的正则表达式

(\d{1,4})((,|.)(\d{1,2})){0,1}

结果是:

MATCH 1 --> 1.5.5 
MATCH 2 --> 1

当然只有第二个是正确的。例外输出是:

MATCH 1 --> 1.5
MATCH 2 --> 1

为什么我的正则表达式会抓住另一个“.5”?我该如何修复我的正则表达式?

3 个答案:

答案 0 :(得分:1)

我已经尝试过这个例子并且它有效(使用group(0)时):

Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> result = re.search('(\d{1,4})((,|.)(\d{1,2})){0,1}', 'Memoria RAM - 1.5GB')
>>> result.group(0)
'1.5'

但是如果你检查groups(),你会得到:

>>> result.groups()
('1', '.5', '.', '5')

为什么?

你正在捕捉:

1)“1”((\d{1,4}));

2)“。”或“,”((,|.)和btw应为(,|\.)因为"." - matches any character except a newline see more here所以你应该使用\.);

3)“5”((\d{1,2});

4)The.5(在poins 2和3 ((,|.)(\d{1,2}))周围使用括号时);

所以你应该删除第4点中的括号,如下所示:

>>> result = re.search('(\d{1,4})(,|\.)(\d{1,2}){0,1}', 'Memoria RAM - 1.5GB')
>>> result.group(0)
'1.5'
>>> result.groups()
('1', '.', '5')

答案 1 :(得分:0)

如果您只需捕获整数/十进制数的每个部分,就像使用正则表达式一样,只需确保小数部分是可选的并使用非捕获组:

(\d{1,4})(?:([,.])(\d{1,2}))?

demo。我还将(,|.)替换为[,.],因为我猜你的意图是匹配逗号或点,而不是逗号或任何字符而不是换行符。

IDEONE demo

import re
p = re.compile(r'(\d{1,4})(?:([,.])(\d{1,2}))?')
test_str = "Memoria RAM - 1.5GB \nMemoria RAM - 1 GB"
print ["".join(x) for x in re.findall(p, test_str)]

或者,您可以使用正则表达式匹配数字:

\d+(?:\.\d+)?

如果您需要在 GB 之前匹配的数字,请使用前瞻:

\d+(?:\.\d+)?(?=\s*GB)

请参阅regex demo

她是IDEONE demo

import re
p = re.compile(r'\d+(?:\.\d+)?')
test_str = "Memoria RAM - 1.5GB \nMemoria RAM - 1 GB"
print (p.findall(test_str))
# => ['1.5', '1']

如果您需要在 GB 之前匹配的数字,请使用前瞻:

\d+(?:\.\d+)?(?=\s*GB)

请参阅regex demo

答案 2 :(得分:0)

result = re.findall(r'(?<!\S)\d\.\d+|(?<!\S)\d',st)

(?<!\S) - not preceded by non-space

print(result)

['1.5', '1']