正则表达式匹配“以0.5或99.9的步长匹配01.0到60.0”?

时间:2019-05-14 13:44:54

标签: python regex regex-lookarounds regex-group

我正在创建与工业真空设备通信的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,也许我忘记了其他一些我没有检查过的情况。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

\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

答案 2 :(得分:1)

另一种分解方法

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

扩展

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

答案 3 :(得分:0)

由于测量设备或各种工业设备记录的数据通常为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。 如前所述,如果您的数据由格式为XX.X的Unicode字符组成,则您必须将其转换为float以进行比较,例如使用motor_freq = float('15.5')