2016-04-27 2 views
1

Im пытаясь разобрать строку цифр, которая выглядит, как этотрегулярное выражение для разбора сложной строки цифр

38,97 -99.63 $ 0.6512.00 1 0 185,00 0 -126,00 1,750 4,87

I хотел бы извлечь все числа с точностью до 2 цифр после точки. Я также хотел бы, чтобы извлечь номер с отсутствующим пространства "0.6512.00"

Я пришел с этим

(- (?:?. \ D + (: \ д {0,2 })?))

но проблема в том, что она разделяет 1,750 до 1,75 и 0

ли кто-нибудь есть идеи, как решить эту проблему? благодаря

+0

Вы можете поместить '\ d *' вне скобок, чтобы включить дополнительные цифры в матче, но не захват.Я бы предложил экспериментировать с, например, https://regex101.com/#python – jonrsharpe

+0

И как «0.6512.00' следует разделить? '0.651' (удаление 1) и' 2.00' или '0.65' и' 12.00'? – Francesco

+0

Вы не можете просто разделить текст на '.split()' и обрабатывать каждое слово разделительно? – svs

ответ

0

Вы можете использовать

(-?\b(?:\d+\.\d{0,2}(?!0*[1-9])|(?<!\d\.)\d+(?!\.\d)))0*\b 

См this regex demo

Главное использует 2 варианта, один для значений с плавающей точкой - \b(?:\d+(?:\.\d{0,2})(?!0*[1-9]) - с 2-х цифр в дробной части, а другой - (?<!\d\.)\d+(?!\.\d) - для сопоставления целочисленных значений. Конечный 0* будет соответствовать поплавкам, но не будет зафиксирован. Использовать значение группы 1.

+0

Это не извлекает номер с отсутствующим пространством и не управляет '1.750', который даже не соответствует – Francesco

+0

@Francesco: вы посмотрели [demo] (https://regex101.com/r/aJ7hJ4/1)? '1.750' не должен совпадать, так как он имеет 3 цифры в десятичной части, и он соответствует' 0.6512.00' –

+0

. Я подозреваю, что это не то, что он просил, но я оставляю его на @manuel – Francesco

0

попробовать это регулярное выражение

\d+\b\.\b(?:(?!\.|)[0-9]){2} 

выход будет enter image description here

0

Вот мои две копейки стоит:

[-+]?\d+(?:(?:\.\d+)(?![.\d])|(?:\.\d{1,2}))? 

Это позволяет дополнительный знак, за которым следует диапазон цифр, затем необязательно -

точка (.) и ряд цифр, не закончился точкой, или ...

точка и 1 или 2 знаков после запятой.

Он заполняет все критерии, с добавлением (исключение?) Закругления 3+ десятичных чисел, т.е. он оставляет, что к числу парсер, так как 1.750 должны быть округлены до 1.75 и 1.758 должны вокруг к 1.76, и нет регулярное выражение будет делать это правильно;).

Se it work here at regex101.

С уважением

Редактировать небольшое упрощение регулярных выражений и описание

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