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

Python “匹配的正则表达式”;01.0到60.0,以0.5或99.9”的步长;?,python,regex,regex-lookarounds,regex-group,Python,Regex,Regex Lookarounds,Regex Group,我正在创建一个与工业真空设备通信的API 有效电机频率值如下所述,其形式为XX.X: 01.0至60.0,以0.5 Hz或99.9 Hz的步长 我自己(用python)找到了以下解决方案: 但是,我仍然可以匹配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')

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

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

01.0至60.0,以0.5 Hz或99.9 Hz的步长

我自己(用python)找到了以下解决方案:

但是,我仍然可以匹配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或5或60.0或99.9
  • $
    字符串结尾

由于测量设备或各种工业设备记录的数据通常为
浮点型
,因此我强烈建议保留浮点型,避免转换为字符串。这样做的好处是,可以避免像
““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\u 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

尽管Joseph Bailey的解决方案可行,但我仍然认为,在进行此类比较时,最好坚持使用浮点类型(假设电机频率也是浮点),如果您能分享您关于如何使用浮点类型验证此数据有效性的想法,我会很高兴。我切换到str,因为在我看来,最好的方式是使用regex而不是多个条件语句。老实说,您需要定义输入的格式。事实上,我在上面写过,并认为输入格式应该是:XX.X(X是任何Unicode字符)。我用python编写代码,所以变量类型没有精确定义。谢谢!看起来很简单也很神奇。我想你应该添加
^
$
,否则这也可以匹配
“abc55.5xyz”
是的,他应该,这取决于输入是什么当然,可能是01.0hz?我不确定他为什么需要正则表达式,但因为这更像是一个正则表达式问题,我会让他对它进行微调。我想要它作为正则表达式,因为问题的复杂性,在CPU方面,我认为这种方法比数学运算和多个“如果”语句更快,以测试所需形式的“浮点”类型的有效性。好的,那么请接受这是否是您所寻找的类型。这与10、20、30、40或50不匹配谢谢,但是,数据通过串行通信以ASCII的形式逐字节发送,因此,将其格式化为float,然后解析或格式化回字节形式似乎很累人,而不是使用正则表达式的一行。是的,那么使用正则表达式可能更好。但是,如果您希望稍后存储/处理该值,则浮点转换会更好。不要忘记,我还需要处理XX.X的格式,因此对于每一个小于10位小数的值,我将需要一次零填充,这在浮点中只有在格式化回str时才可能
   (?: 0 [1-9] | [1-5] \d )
   \. [05] 
|  
   60\.0
|  
   99\.9