RegEx для соответствия "01,0 - 60,0 с шагом 0,5 или 99,9"? - PullRequest
1 голос
/ 14 мая 2019

Я создаю API для связи с промышленным вакуумным устройством.

Допустимые значения частоты двигателя указаны ниже в форме XX.X:

01,0–60,0 с шагом 0,5 Гц или 99,9 Гц

Я сам пришел к следующему решению (в python):

import re
p = re.compile('[0-5]\d.[05]|01.0|60.0|99.9')

Однако я все еще могу соответствовать 00.5, что не должно совпадать.

Я не хочу явно исключать 00.5, и, возможно, я забыл какой-то другой конечный случай, который я не проверял.

Как мне решить эту проблему?

Ответы [ 4 ]

1 голос
/ 14 мая 2019

Еще один способ сломать его

(?:0[1-9]|[1-5]\d)\.[05]|60\.0|99\.9

Расширен

   (?: 0 [1-9] | [1-5] \d )
   \. [05] 
|  
   60\.0
|  
   99\.9
1 голос
/ 14 мая 2019

\d соответствует цифрам 0-9.Если вы не хотите, чтобы значение начиналось с 00, вы можете использовать отрицательный прогноз (?! 00)

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

^(?!00)[0-5]\d\.[05]|60\.0|99\.9$
  • ^(?!00)Начало строки и утверждение, что прямо справа не является 00
  • [0-5]\d Совпадение 00 - 59
  • \.[05]|60\.0|99\.9 Совпадение с точкой и цифрой 0 или 5 или 60.0 или 99.9
  • $ Конец строки

Regex demo

1 голос
/ 14 мая 2019

Просто добавьте 0[1-9]\.[05] в качестве опции и ограничьте другую базу 1-5

p = re.compile('0[1-9]\.[05]|[1-5]\d\.[05]|60\.0|99\.9')

Вам также нужно использовать \. вместо ., потому что . означает любой символ. Наконец, больше не нужно условие 01.0

0 голосов
/ 14 мая 2019

Поскольку данные, записываемые измерительными устройствами или всеми видами промышленных устройств, обычно имеют тип float, я настоятельно рекомендую сохранить тип с плавающей запятой и избегать преобразования в строку.Это имеет то преимущество, что такие строки, как '"abc55.5xyz"', исключаются, и регистрируются только допустимые значения с плавающей точкой.Это также должно быть быстрее, чем использование регулярных выражений с преобразованием float-> str.Например, вы можете использовать numpy для проверки правильности значений.

Сначала вам нужно создать массив правильных значений.Вам нужно сделать это только один раз в начале кода.Нет необходимости делать это на каждой итерации.

import numpy as np
lowest_val = 1.
interm_val = 60.
stepsize = .5
highest_val = 99.9
# create the array of correct values:
correct_vals = np.empty(120)
# fill array with steps:
correct_vals[:-1] = np.linspace(lowest_val, interm_val, num=int((interm_val - lowest_val)/stepsize + 1))
correct_vals[-1] = highest_val  # add highest value

Теперь вы можете проверять правильные значения с помощью

motor_freq in correct_vals

Это вернет True, когда частота двигателя находится в пределах указанных значенийиначе False.Если, как вы добавили, ваши данные состоят из символов Unicode в формате XX.X, вам придется преобразовать их в число с плавающей запятой для сравнения, например, с помощью motor_freq = float('15.5')

...