使用Python正则表达式从字符串中提取数字

时间:2015-09-17 18:50:09

标签: regex python-2.7

我跑了正则表达式

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

这不能给我正确的结果。它会跳过两个或更多数字。怎么了?

1 个答案:

答案 0 :(得分:1)

猜测 您想要使用lazy match on the dot-match-all

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

默认情况下,大多数正则表达式都是贪婪的(即它们尝试尽可能多地从左到右匹配)。当您说max .*时,它会匹配Max,然后匹配字符串最后的所有内容。然后你的代码"回溯"直到找到\d+\.\d+的最后一个实例。在量词(?*等)之后添加+表示一旦找到下一个序列(在本例中为数字),它就会停止匹配。

您还会注意到我删除了第一个\d周围不必要的字符类。

有时,如果可以的话,我建议避免懒惰的重复。看起来所有输入的格式都类似 - " Max [field]([unit]):[value]" - 意思是我们可以more specific with the expression

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

我个人更愿意在我的(或员工的)代码中看到后者的正则表达式。它具有较小的意外后果空间,具有更好的性能,并且对于您希望它匹配的内容更为明显。