避免"双重搜索"使用正则表达式匹配组时

时间:2015-05-22 13:00:39

标签: regex python-2.7

是否有更有效的方法:

if re.search("(?P<value>[0-9]*[.][0-9]*) (?P<units>KB|MB|GB|TB|PB)", line):
    m = re.search("(?P<value>[0-9]*[.][0-9]*) (?P<units>KB|MB|GB|TB|PB)", line)
    self.capacity = convert_to_bytes(m.group("units"), m.group("value"))

与C和其他语言一样,您可以执行此操作并避免执行两次搜索:

if m = re.search("(?P<value>[0-9]*[.][0-9]*) (?P<units>KB|MB|GB|TB|PB)", line):
    self.capacity = convert_to_bytes(m.group("units"), m.group("value"))

这是更好的方法吗?

m = re.search("(?P<value>[0-9]*[.][0-9]*) (?P<units>KB|MB|GB|TB|PB)", line)

if m:
    self.capacity = convert_to_bytes(m.group("units"), m.group("value"))

1 个答案:

答案 0 :(得分:0)

正如@Christian Aichinger所说,这是正确的方法,但我有点削减正则表达式:

m = re.search("(?i)(?P<value>[0-9]+(?:\\.[0-9]+)?) (?P<units>KB|MB|GB|TB|PB)", line)
if m:
    self.capacity = convert_to_bytes(m.group("units"), m.group("value"))

现在,[0-9]+(?:\\.[0-9]+)?将匹配一些数字和可选的小数部分。请注意,如果您有其他小数点分隔符,或者您想要包含一千个数字分组符号,那么您更喜欢使用像[0-9]+(?:[., ][0-9]+)?这样的字符类(俄语或波兰语,空格是有效的千位分组符号)。

此外,使正则表达式模式不区分大小写也是一个好主意,因此它也匹配1,000 kb

Sample code

import re
line = "1.56 kb"
m = re.search("(?i)(?P<value>[0-9]+(?:\\.[0-9]+)?) (?P<units>KB|MB|GB|TB|PB)", line)
if m:
    print m.group("units") + " - " + m.group("value")

输出:

kb - 1.56
相关问题