2015-09-17 4 views
0

Я побежал регулярное выражениеИзвлечение цифры из строки с Python регулярное выражение

re.findall(r"max .*([\d]+\.\d+)",m,re.I) 

на входе

mps): 22.624001\r\nMax Phase Current Gain Error (Percent): 0.500000\r\nMax Phase Current Offset Error (Amps): 0.113120\r\nFan Control Timer (nS): 60000002048.000008\r\nPWM Dead Time (uS): 0.000004\r\n\r\n--------------------------AXIS_INSTANCE_3--------------------------\r\n\r\nPiccolo ServoIO Stats :\r\n\tTotal Missed Read Phase : 0\r\n\tTotal Missed Write Phase : 0\r\n\tTotal Read CRC Error : 0\r\n\tTotal Write CRC Error : 0\r\n\tTotal Invalid Seq. ID : 0\r\n\tTotal (General) Sequence Errors : 1\r\n\r\nOmap to Piccolo Read Packet :\r\nCommand/Fault Word : 0x0\r\nSequenceAndIncipSize : 0xc0\r\n\r\nOmap to Piccolo Read Packet :\r\nCommand/Fault Word : 0x0\r\nSequenceAndIncipSize : 0xc0\r\n\r\nPiccolo to Omap Read Packet :\r\nUPhase Current : 32779\r\nWPhase Current : 32776\r\nVbus : 0\r\n\r\nOmap to Piccolo Write Packet :\r\nUPhase Mod Idx : 0\r\nVPhase Mod Idx : 0\r\nWPhase Mod Idx : 0\r\n\r\nPiccolo to Omap Write Packet :\r\nStatus/Fault Word: 0x0\r\nSequenceAndIncipSize: 0x70\r\n\r\n\r\nPiccolo to Omap Low-Speed Data :\r\nPiccolo ADC Temp : 0.000000 degC\r\nPiccolo Igbt Temp : 23.618481 degC\r\n\r\nPower Interface Scaling:\r\nPhase Current Feedback Offset Counts: 32767.000000\r\nPhase Current Feedback Gain Scaling: -0.002142\r\nDC Bus Voltage Feedback Offset Counts: 0.000000\r\nDC Bus Voltage Feedback Gain Scaling: 0.013757\r\nMax Phase Current (Amps): 609.198303\r\nPhase Current Gain Error Measurement Point (Amps): 22.624001\r\nMax Phase Current Gain Error (Percent): 0.500000\r\nMax Phase Current Offset Error (Amps): 0.113120\r\nFan Cont 

, которая не дает мне правильный результат. Он пропускает две или более цифр. Что не так?

+2

Что такое * * правильный результат? Покажите нам, что вы пробовали в более глубоком смысле: не просто регулярное выражение, а то, почему вы думали, что это сработает, результат, который вы получите, и ожидаемый результат. В противном случае мы не можем вам помочь. –

ответ

1

Я угадал, что вы хотите использовать lazy match on the dot-match-all.

max .*?(\d+\.\d+) 

По умолчанию большинство регулярных выражений жадные (т.е. они пытаются соответствовать как можно больше, слева направо). Когда вы говорите max .*, он соответствует Max, а затем все до самого конца строки. Затем ваш код «backtracked», пока не найдет последний экземпляр \d+\.\d+. Добавление ? после квантификатора (*, + и т. Д.) Означает, что он прекращает сопоставление, как только будет найдена следующая последовательность (в этом случае цифры).

Вы также заметите, что я удалил ненужный класс символов вокруг первого \d.


Иногда, если можно, я рекомендую избегать ленивого повторения. Похоже, что все ваши ввода отформатирован аналогично - «Макс [поле] ([единица измерения]): [значение]» - это означает, что мы можем быть more specific with the expression:

(Max [^:]+): ([\d.]+) 

Я лично предпочел бы видеть последнее регулярное выражение в моем (или рабочем) коде. Он имеет меньше возможностей для непредвиденных последствий, имеет лучшую производительность и более очевидно, что вы хотите, чтобы он соответствовал.

+0

Ввод = 'байты = 32 раза = 1 мс TTL = 255 \ r \ n \ r \ nПитание статистики для 192.168.1.1:\r\n Пакеты: Отправлено = 4, Получено = 4, Потеряно = 0 (0% потерь), \ r \ nПропроксимальное время прохода в миллисекундах: \ r \ n Минимальное = 1 мс, Максимум = 1 мс, Среднее = 1мс \ r \ n ' Для вышеприведенной строки я использовал {re.findall (r "Pack [^ \ (] + (\ d) ", t, re.I)} regex, но он тоже не работает. Мне нужно [4,4,0] в качестве вывода. Может ли рассказать мне, что я делаю неправильно в своем regex? – OO7

+0

@ OO7 вы просто фиксируете одну цифру - как вы ожидали, что она получит все 3 цифры? Используйте что-то вроде ['Пакеты: [^ =] + = (\ d), [^ =] + = (\ d), [^ =] + = (\ d) '] (https://regex101.com/r/uU1gW7/1). – Sam

+0

Эй, Сэм, ты потрясающий. Спасибо за вашу поддержку. нужен вывод в виде списка Like [4,4,0] вместо [('4', '4', '0')]. можем ли мы это сделать? – OO7

Смежные вопросы