用于匹配“01.0 到 60.0,步长为 0.5 或 99.9”的正则表达式?

RegEx for matching "01.0 to 60.0 in steps of 0.5, or 99.9"?

我正在创建一个 API 来与工业真空设备通信。

有效的电机频率值如下所述,格式为XX.X:

01.0 到 60.0,步长为 0.5 Hz,或 99.9 Hz

我自己得出了以下解决方案(在python):

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

不过我还是可以匹配到00.5,应该是匹配不到的

我不想明确排除 00.5,也许我忘记了一些我没有检查的其他最终情况。

如何解决这个问题?

只需添加 0[1-9]\.[05] 作为选项并将其他基数限制为 1-5

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

您还需要使用 \. 而不是 . 因为 . 表示任何字符。 终于不再需要 01.0 条件

\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 or 5 or 60.0 or 99.9
  • $ 字符串结束

Regex demo

由于测量设备或各种工业设备记录的数据通常是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

当电机频率在指定值内时,这将 return True,否则 False。 如果,如您所添加的,您的数据由 XX.X 格式的 unicode 字符组成,则必须将其转换为浮点数以进行比较,例如 motor_freq = float('15.5')

另一种分解方法

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

展开

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