根据对与正则表达式相关的其他问题的回答,我认为我的机会很小。
我尝试解析不同表示形式的数字:
12345(234567)
12345(234.56K)
我无法从中控制源格式。
我想我可以为不同的格式想出不同的正则表达式。如何检测哪种格式是哪种?寻找字母“K”是否必须是蛮力方式?
请您参考如下方法:
这种事情通常是通过迭代一堆正则表达式并在找到匹配的表达式时停止来完成的——因为从字符串到数字的转换需要超出正则表达式能力的特殊解析。这意味着您需要以一种您知道会给出正确答案的方式来订购它们。在这种情况下,您可以这样做:
PARSERS = (
(re.compile(r'([0-9]+)\(([-+0-9.]+)[mM]\)'), 1000000),
(re.compile(r'([0-9]+)\(([-+0-9.]+)[kK]\)'), 1000),
(re.compile(r'([0-9]+)\(([-+0-9.]+)\)'), 1),
)
def parse(num):
for pattern, multiplier in PARSERS:
match = pattern.match(num)
if match is not None:
return float(match.group(1)), float(match.group(2)) * multiplier
raise ValueError("Failed to parse")
顺便说一句,这种模式在其他地方也很常见,比如决定 which function will handle a web request基于 URL。
只是为了好玩,这里有一个替代实现,它使用字典查找和单个正则表达式而不是迭代:
MULTIPLIER = {
'M': 1000000,
'K': 1000,
'': 1,
}
PATTERN = re.compile(r'(\d+)\(([-+.\d]+)([kKmM]?)\)')
def parse(num):
match = PATTERN.match(num)
if match is None:
raise ValueError("Failed to parse")
first, second, suffix = match.groups()
suffix = suffix.upper()
if suffix not in MULTIPLIER:
raise ValueError("Unrecognised multiplier %s" % suffix)
return float(first), float(second) * MULTIPLIER[suffix]
