Python Regex:Key,值多次,仅当存在MAC时
这有多难?? 我有以下几行:Python Regex:Key,值多次,仅当存在MAC时,python,regex,Python,Regex,这有多难?? 我有以下几行: 2021-05-25 14:54:11,517 INFO:[APP-MESSENGER] rx messages: meta_data=IfData={'dt': '12:54:11.516', 'meta': BleDevice={'id': 0, 'name': 'CD:7C:2D:0E:C4:04', 'rssi': -40}, 'header': Header={'timestamp': 56903198}}, len=10, msgs=[SysHeapIn
2021-05-25 14:54:11,517 INFO:[APP-MESSENGER] rx messages: meta_data=IfData={'dt': '12:54:11.516', 'meta':
BleDevice={'id': 0, 'name': 'CD:7C:2D:0E:C4:04', 'rssi': -40}, 'header': Header={'timestamp': 56903198}},
len=10, msgs=[SysHeapInfo={'time': 56003295, 'free_heap': 22504, 'min_ever_free_heap': 22320,
'data_queue_free': 50}, SysHeapInfo={'time': 56103271, 'free_heap': 22504, 'min_ever_free_heap': 22320,
'data_queue_free': 50}, SysHeapInfo={'time': 56203247, 'free_heap': 22504, 'min_ever_free_heap': 22320,
'data_queue_free': 50}, SysHeapInfo={'time': 56303222, 'free_heap': 22504, 'min_ever_free_heap': 22320,
'data_queue_free': 50}, SysHeapInfo={'time': 56403198, 'free_heap': 22504, 'min_ever_free_heap': 22320,
'data_queue_free': 50}, SysHeapInfo={'time': 56503173, 'free_heap': 22504, 'min_ever_free_heap': 22320,
...
在该行中有多个相同的键、值对,其键为time
和data\u queue\u free
我想要的是一个2D数组,第一列是time键的值,第二列是data\u queue\u free键。但如果该行中存在MAC(CD:7C:2D:0E:C4:04),则为on
到目前为止,我想到的是:
(?:CD:7C:2D:0E:D4:04){1}((时间:(\d+)|(数据队列:(\d+)))
如果没有MAC,它可以正常工作,但是我没有MAC过滤器
((time':(\d+)|(data\u queue\u free':(\d+))
您可以采取两步方法,首先捕获组1中MAC地址CD:7C:2D:0E:C4:04之后的所有内容
^.*?'CD:7C:2D:0E:C4:04'([\s\S]+)
如果该模式的匹配范围太广,您还可以将匹配限制在SysHeapInfo=
部分内(假设数据以]结束)
^.*?'CD:7C:2D:0E:C4:04'[^][]*\[(SysHeapInfo={[^{}]*}(?:,\s*SysHeapInfo={[^{}]*})*)]
然后将该模式与第一个模式的group 1值上的time和data_queue_free两个组一起使用,并将这些值添加到它们自己的列表中
输出
['50', '50', '50', '50', '50']
['56003295', '56103271', '56203247', '56303222', '56403198', '56503173']
请注意如果数据中的值始终存在且按该顺序排列,则不必使用替代项|
,但也可以按该顺序匹配它们:
'time': (\d+),[^{}]*'data_queue_free': (\d+)
您可以采取两步方法,首先捕获组1中MAC地址CD:7C:2D:0E:C4:04之后的所有内容
^.*?'CD:7C:2D:0E:C4:04'([\s\S]+)
如果该模式的匹配范围太广,您还可以将匹配限制在SysHeapInfo=
部分内(假设数据以]结束)
^.*?'CD:7C:2D:0E:C4:04'[^][]*\[(SysHeapInfo={[^{}]*}(?:,\s*SysHeapInfo={[^{}]*})*)]
然后将该模式与第一个模式的group 1值上的time和data_queue_free两个组一起使用,并将这些值添加到它们自己的列表中
输出
['50', '50', '50', '50', '50']
['56003295', '56103271', '56203247', '56303222', '56403198', '56503173']
请注意如果数据中的值始终存在且按该顺序排列,则不必使用替代项|
,但也可以按该顺序匹配它们:
'time': (\d+),[^{}]*'data_queue_free': (\d+)
正确使用2个正则表达式组合以获得所需输出正确使用2个正则表达式组合以获得所需输出