这是我的字符串,我正在使用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”?我该如何修复我的正则表达式?
答案 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。我还将(,|.)
替换为[,.]
,因为我猜你的意图是匹配逗号或点,而不是逗号或任何字符而不是换行符。
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']