Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式-匹配、比较和决定_Python_Regex_Dictionary - Fatal编程技术网

Python正则表达式-匹配、比较和决定

Python正则表达式-匹配、比较和决定,python,regex,dictionary,Python,Regex,Dictionary,我有一个字典,它有不同的Ip作为键,它的ping结果作为值。我只想在ping结果通过特定条件时继续执行脚本 假设以下为ping结果(字典值): 我创建了一个正则表达式,并提取了以下每个值: match = re.search(r'(\d+\s* packet\w* transmitted), (\d+\s* packet\w* received), (\d+\.\d+ packet loss)',str,re.M|re.I) >>> match.group(3) '10.00

我有一个字典,它有不同的Ip作为键,它的ping结果作为值。我只想在ping结果通过特定条件时继续执行脚本

假设以下为ping结果(字典值):

我创建了一个正则表达式,并提取了以下每个值:

match = re.search(r'(\d+\s* packet\w* transmitted), (\d+\s* packet\w* received), (\d+\.\d+ packet loss)',str,re.M|re.I)

>>> match.group(3)
'10.00% packet loss'
我已经提取了这些值

现在我想编写一个带条件的正则表达式,通过它,我将要求脚本仅在每个Ip的丢包率小于5%时继续执行;它在我的字典上

我可以再次考虑从数据包丢失中提取数据,然后进行比较,但我只是想知道是否有更好的方法来做到这一点


如果有任何想法,请分享

您可以只匹配感兴趣的部分,并且只能使用正则表达式匹配小于5%的数字:

match = re.search(r' +[0-4]\.\d+% packet loss', str, re.M | re.I)
if match:
    do_stuff_with_match()

但是,请注意,正则表达式比数值比较慢得多,因此您可能仍希望使用上一次解析的结果。

您可以只匹配感兴趣的部分,并且只匹配正则表达式中小于5%的数字:

match = re.search(r' +[0-4]\.\d+% packet loss', str, re.M | re.I)
if match:
    do_stuff_with_match()

但是,请注意,正则表达式比数值比较慢得多,因此您可能仍然希望使用前面解析的结果。

您不需要正则表达式:

s = "10 packets transmitted, 10 packets received, 0.00% packet loss"
trans,recv,loss = s.split(",")

print(trans,recv,loss)
('10 packets transmitted', ' 10 packets received', ' 0.00% packet loss')
print(float(loss.split("%")[0] > 5))
False

如果您有dict,请使用
all
检查每个值是否大于5%

您不需要正则表达式:

s = "10 packets transmitted, 10 packets received, 0.00% packet loss"
trans,recv,loss = s.split(",")

print(trans,recv,loss)
('10 packets transmitted', ' 10 packets received', ' 0.00% packet loss')
print(float(loss.split("%")[0] > 5))
False

如果您有dict,请使用
all
检查每个值是否大于5%

这是一个输入错误
\d+*oops对不起,这是一个输入错误。@sln这是一个嵌套的量词吗?我看到
一个或多个数字后跟零个或多个空格
。或者你也有打字错误;)@肯尼思克他在
\d+*
之前有一个打字错误。我想他已经修好了。这是一个打字错误吗?
\d+*oops对不起,这是一个打字错误。@sln这是一个嵌套的量词吗?我看到
一个或多个数字后跟零个或多个空格
。或者你也有打字错误;)@肯尼思克他在
\d+*
之前有一个打字错误。我想他已经修好了。正则表达式不做数值比较,所以它不能慢。事实上,由于无论如何都必须对其进行解析,因此只需要在
[0-4]
上使用不匹配项。我可以知道正则表达式中+的意义吗?因为我可以和这个相匹配。match=re.search(r'[0-5]\.\d+%packet loss',str,re.M | re.I)>>>>匹配>>该
[space]+
与前导空格匹配。但是你是对的,没有它你也可以过得去。如果你用的是OTH,你就需要它;但是您的正则表达式无论如何都需要不同。@sln:正则表达式解析比简单的数值比较慢得多。用
timeit
试试。在这里的例子中,数值解析已经完成,因此使用这些结果比使用第二个正则表达式更有效。一般来说,最好使用正则表达式进行解析,然后再处理解析结果,而不是重新解析。
使用正则表达式进行解析,然后再处理解析结果,而不是重新解析。
-是的,谁说了关于重新解析的事?不需要重新分析任何内容,也不需要使用浮点转换(特别是在布尔表达式中)。只需要一个简单的
([^,]+),([^,]+),(\s*(?:(0*[0-4])|\d+)。\d+%[^,]+)
匹配和组4不为空。这是简单的验证。正则表达式不做数值比较,所以它不能慢。事实上,由于无论如何都必须对其进行解析,因此只需要在
[0-4]
上使用不匹配项。我可以知道正则表达式中+的意义吗?因为我可以和这个相匹配。match=re.search(r'[0-5]\.\d+%packet loss',str,re.M | re.I)>>>>匹配>>该
[space]+
与前导空格匹配。但是你是对的,没有它你也可以过得去。如果你用的是OTH,你就需要它;但是您的正则表达式无论如何都需要不同。@sln:正则表达式解析比简单的数值比较慢得多。用
timeit
试试。在这里的例子中,数值解析已经完成,因此使用这些结果比使用第二个正则表达式更有效。一般来说,最好使用正则表达式进行解析,然后再处理解析结果,而不是重新解析。
使用正则表达式进行解析,然后再处理解析结果,而不是重新解析。
-是的,谁说了关于重新解析的事?不需要重新分析任何内容,也不需要使用浮点转换(特别是在布尔表达式中)。只需要一个简单的
([^,]+),([^,]+),(\s*(?:(0*[0-4])|\d+)。\d+%[^,]+)
匹配和组4不为空。这是简单的验证。