【问题标题】:Python Regular Expression - match , compare and decidePython 正则表达式 - 匹配、比较和决定
【发布时间】:2015-02-19 09:25:22
【问题描述】:

我有一个字典,它有不同的 Ip 作为键,它的 ping 结果作为值。仅当 ping 结果通过特定标准时,我才想继续执行我的脚本

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

10 packets transmitted, 10 packets received, 0.00% packet loss

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

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;s 的丢包率小于 5% 时才继续执行。

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

如果有任何想法,请分享..

【问题讨论】:

  • 这是一个错字\d+ * <-- Nested quantifier 吗?
  • 抱歉,打错了。
  • @sln 那是一个嵌套量词吗?我看到one or more digits followed by zero or more spaces。或者你也有错字;)
  • @KennethK。 - 他在\d+* 之前有一个错字。认为他修好了。

标签: python regex dictionary


【解决方案1】:

你不需要正则表达式:

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%

【讨论】:

    【解决方案2】:

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

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

    但是请注意,正则表达式比数值比较慢很多,所以你还是希望使用之前解析的结果。

    【讨论】:

    • 正则表达式不做数值比较,所以不能慢。事实上,因为无论如何都必须对其进行解析,所以只需要在 [0-4] 上不匹配即可。
    • 我可以知道正则表达式中 + 的意义吗?因为我可以匹配这个本身。 match = re.search(r'[0-5]\.\d+% packet loss',str,re.M|re.I) >>> match <_sre.sre_match object at> >>>
    • [space]+ 匹配前导空格。但你是对的,没有它你也能过得去。如果您使用的是match OTH,则需要那个位;但是你的正则表达式无论如何都需要不同。
    • @sln:正则表达式解析比简单的数值比较慢得多。试试timeit。在这种情况下,数值解析已经完成,因此使用这些结果比使用第二个正则表达式更有效。一般来说,最好使用正则表达式进行解析,然后再处理解析结果,而不是重新解析。
    • use regex for parsing, and then deal with the parsed results later, rather than re-parsing - 是的,谁说过重新解析?无需重新解析任何内容,也无需使用浮点转换(尤其是在布尔表达式中)。一个简单的([^,]+),([^,]+),(\s*(?:(0*[0-4])|\d+)\.\d+%[^,]+) match && group 4 is not NULL 就足够了。这是简单的验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 2013-09-22
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多