文字列から数値への変換で正規表現の機能を超える特別な解析が必要なため、このような種類の正規表現を繰り返し実行し、一致するものが見つかると停止することがよくあります。それはあなたが正しい答えを与えることがわかっている方法でそれらを注文する必要があることを意味します。この場合、あなたはこのような何かがあります脇
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")
ように、このパターンは、このようなURLに基づいて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]
出典
2016-05-29 11:17:28
z0r
'([0-9])+'唯一の最後の数字をキャプチャします。 '([0-9] +)'を使います。 '[0-9]'は '\ d'で置き換えることもできます。 –
@ z0r:ありがとう!ちょうど私はチャンスがスリムであると思っていました。 – chapter3
@Alex:最適化のおかげで! :) – chapter3