2016-05-29 3 views
2

Я думаю, что мои шансы тонкие, основанные на ответах на другие вопросы, связанные с регулярными выражениями.Регулярное выражение для финансовых чисел

Я пытаюсь разобрать число в различных представлениях:

12345(234567) 
12345(234.56K) 

, из которого я не могу контролировать формат источника.

Я полагаю, что могу придумать различные регулярные выражения для разных форматов. Как определить, какой формат является? Должен ли он быть грубым способом поиска буквы «К»?

ответ

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 на основе URL.

Просто для удовольствия, вот альтернативная реализация, которая использует словарь Lookups и регулярное выражение, вместо итерации:

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

Смежные вопросы