Регулярное выражение: найти числа, превышающие определенное значение (с различной десятичной длиной) - PullRequest
3 голосов
/ 28 марта 2019

Я пытаюсь найти все значения в списке, которые больше или равны .03. Самое сложное в том, что мои значения имеют от 9 до 15 десятичных знаков.

Мой текущий код работает несколько, но громоздко - любой совет очень ценится:

^(?:0?\.[0-9][3-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|0?\.[0-9][3-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|0?\.[0-9][3-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])$

Спасибо.

Ответы [ 3 ]

1 голос
/ 28 марта 2019

Вы можете использовать звездочку, чтобы обозначить ноль или более цифр:

^(?:0?\.\d[3-9]\d*)$

Это дает дополнительное преимущество, заключающееся в точном совпадении 0.03 или чего-то с (скажем) 100 десятичными знаками.

Если вы хотите быть строгими в отношении десятичных знаков, вы можете использовать синтаксис фигурных скобок, который соответствует любым повторениям в диапазоне от 9 до 15 цифр:

^(?:0?\.\d[3-9]\d{9,15})$

Обратите внимание, что, как написано, это регулярное выражение не соответствует чему-либо большему или равному 0,03 - оно соответствует чему-либо большему или равному 0,03 и меньше чем 1, и оно не соответствует, скажем, 0,1, что больше 0,03. Чтобы сопоставить что-либо больше 0,03, лучше всего пропустить регулярное выражение и разобрать число.

0 голосов
/ 28 марта 2019

А вот и вы: 0.030000000 - 0.999999999999999

Больше или равно 0,03 и меньше 1,0
в 9-15 десятичных разрядах

0?\.(?:03\d{7,13}|0[4-9]\d{7,13}|[1-9]\d{8,14})

Расширен

 #  0.030000000  -  0.999999999999999
 0?
 \.
 (?:
      03 \d{7,13} 
   |  0 [4-9] \d{7,13} 
   |  [1-9] \d{8,14} 
 )

Примечание - это было сгенерировано машиной, может быть некоторое наложение.
Пример: 0?\.(?:0[3-9]\d{7,13}|[1-9]\d{8,14})

0 голосов
/ 28 марта 2019

Вы должны просто проанализировать ваши данные как float:

Из вашего паттерна вы, кажется, уже очень хорошо отделили числа - зачем вообще использовать регулярные выражения?Ваши числа заполняют всю строку или не совпадают вообще (r"^........$", так что по существу у вас есть:

t = """0.0000002
0.4
0.04
0.004
24544.23354
Also Bad"""

Просто разбейте на строки и отметьте каждую строку как float

# splits the string into a list of lines
for line in (x.strip() for x in t.split("\n")):
    try:
        if float(line) >= 0.03:
            print(line)
        else: 
            print("Not ok:",line)
    except:
        print("Not ok:",line)

Выход:

Not ok: 0.0000002
0.4
0.04
Not ok: 0.004
24544.23354
Not ok: Also Bad
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...