用于匹配“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
$
字符串结束
由于测量设备或各种工业设备记录的数据通常是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
我正在创建一个 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$
字符串结束
由于测量设备或各种工业设备记录的数据通常是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