2016-05-29 10 views
2

正規表現に関連する他の質問への回答に基づいて、私のチャンスはスリムであると思います。金融番号の正規表現

私は別の表現で数値を解析しようとしています:

12345(234567) 
12345(234.56K) 

そこから私は、ソース形式を制御することはできません。

さまざまな形式の異なる正規表現を考え出すことができます。どのフォーマットをどのように検出するのですか?それは文字 'K'を探すために強引な方法であるか?

答えて

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") 

ように、このパターンは、このような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] 
+1

'([0-9])+'唯一の最後の数字をキャプチャします。 '([0-9] +)'を使います。 '[0-9]'は '\ d'で置き換えることもできます。 –

+0

@ z0r:ありがとう!ちょうど私はチャンスがスリムであると思っていました。 – chapter3

+0

@Alex:最適化のおかげで! :) – chapter3