我正在创建与工业真空设备通信的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)
只需添加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 $
字符串结尾答案 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')