2014-12-20 3 views
1

У меня есть словарь, который имеет различный Ip's Key и его результат ping как Value. я хочу, чтобы продолжить мой сценарий, только тогда, когда результаты пинга проходит определенные критерииPython Regular Expression - сопоставление, сравнение и выбор

Если предположить следующее, как результат пинга (значение словаря):

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' 

Я извлекаемые значения ..

Теперь я хочу написать регулярное выражение с критериями, беспересадочный ugh, который я попрошу сценарий продолжить выполнение, только если процент потери пакетов составляет менее 5% для каждого Ip; s в моем словаре.

Я могу думать о том, чтобы снова взять цифры из потери пакетов, а затем сравнить, но было просто интересно, есть ли лучший способ сделать это?

если какие-либо идеи, пожалуйста, поделитесь ..

+0

Является ли это опечатка '\ d + * <- Уплотненный квантификатор'? – sln

+0

oops извините, что это была опечатка. – user596922

+0

@sln Как это вложенный квантор? Я вижу «одну или несколько цифр, за которыми следуют ноль или больше пробелов». Или у вас тоже была опечатка;) –

ответ

2

Вам не нужно регулярное выражение:

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 

Если у вас есть использование ДИКТ 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

Регулярное выражение не выполняет численное сравнение, поэтому оно не может быть медленнее. На самом деле, поскольку он все равно должен быть проанализирован, то совпадение в '[0-4]' не обязательно. – sln

+0

Могу ли я узнать значение + здесь в регулярном выражении? потому что я мог бы соответствовать этому самому. match = re.search (r '[0-5] \. \ d +% потери пакетов', str, re.M | re.I) >>> соответствие <_sre.SRE_Match объект в 0x02ADE608> >>> – user596922

+0

'[Пробел] +' соответствует ведущим пространствам. Но вы правы, вы можете обойтись без него. Если вы использовали [match] (https://docs.python.org/2/library/re.html#re.RegexObject.match) OTH, вам понадобится этот бит; но тогда ваше регулярное выражение должно быть различным. –