我认为根据对正则表达式相关的其他问题的回答,我的机会很小。
我尝试用不同的表示法解析数字:
12345(234567)
12345(234.56K)
我无法控制源格式。
我想我可以为不同的格式提出不同的正则表达式。如何检测哪种格式?是否有蛮力的方式来寻找字母' K'?
答案 0 :(得分:3)
这种事情通常是通过迭代一堆正则表达式并在找到匹配的句子时停止 - 因为从字符串到数字的转换需要超出正则表达式功能的特殊解析。这意味着您需要以您知道会给出正确答案的方式订购它们。在这种情况下,您可能会这样做:
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。
只是为了好玩,这里有一个替代实现,它使用字典查找和单个正则表达式而不是迭代:
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]