捕获多行文本中出现的多个字符串
Catch multiple string occurrences in multiline text
我已经做了一段时间了,我正在尝试从中提取一些值
使用 re.findall 的多行文本中的字符串模式,运气不好。
正文:
RX[0]
qpn : 0x48
cqn : 0x80
rxBytes : 179531811
rxPackets : 296242
rxPacketsDropped : 0
rxCheckSumOk : 225257
rxCheckSumNone : 200
RX[1]
qpn : 0x49
cqn : 0x81
rxBytes : 0
rxPackets : 0
rxPacketsDropped : 0
rxCheckSumOk : 0
rxCheckSumNone : 0**
我需要提取索引 -> RX[index]
和 rxPackets : value
如果我分成几个部分超出我的使用范围 -
re.findall('RX\[(\d+)\].*rxPackets\s*:\s*(\d+)', section, re.DOTALL)
但我希望使用单个正则表达式模式来执行此操作。
任何人都可以帮助我阐明如何做到这一点吗?
我太笨了,不会用正则表达式来解决这个问题。
rxDict = dict()
key = ''
for line in lines:
if 'RX' in line:
key = line.split('[')[-1].split(']')[0]
if key != '':
if 'rxPackets' in line:
rxDict[key] = line.split(':').strip()
key = ''
这个有效:
>>> txt='''\
... RX[0]
... qpn : 0x48
... cqn : 0x80
... rxBytes : 179531811
... rxPackets : 296242
... rxPacketsDropped : 0
... rxCheckSumOk : 225257
... rxCheckSumNone : 200
... RX[1]
... qpn : 0x49
... cqn : 0x81
... rxBytes : 0
... rxPackets : 0
... rxPacketsDropped : 0
... rxCheckSumOk : 0
... rxCheckSumNone : 0**
... '''
>>> import re
>>> re.search(r'RX\[(\d+)\].*?rxPackets\s+:\s+(\d+)', txt, re.S).groups()
('0', '296242')
或者,使用 findall:
>>> re.findall(r'RX\[(\d+)\].*?rxPackets\s+:\s+(\d+)', txt, re.S)
[('0', '296242'), ('1', '0')]
与.*
的贪婪形式比较:
>>> re.findall(r'RX\[(\d+)\].*rxPackets\s+:\s+(\d+)', txt, re.S)
[('0', '0')]
您可以在此处直观地看到 greedy and not greedy
我已经做了一段时间了,我正在尝试从中提取一些值 使用 re.findall 的多行文本中的字符串模式,运气不好。
正文:
RX[0]
qpn : 0x48
cqn : 0x80
rxBytes : 179531811
rxPackets : 296242
rxPacketsDropped : 0
rxCheckSumOk : 225257
rxCheckSumNone : 200
RX[1]
qpn : 0x49
cqn : 0x81
rxBytes : 0
rxPackets : 0
rxPacketsDropped : 0
rxCheckSumOk : 0
rxCheckSumNone : 0**
我需要提取索引 -> RX[index]
和 rxPackets : value
如果我分成几个部分超出我的使用范围 -
re.findall('RX\[(\d+)\].*rxPackets\s*:\s*(\d+)', section, re.DOTALL)
但我希望使用单个正则表达式模式来执行此操作。 任何人都可以帮助我阐明如何做到这一点吗?
我太笨了,不会用正则表达式来解决这个问题。
rxDict = dict()
key = ''
for line in lines:
if 'RX' in line:
key = line.split('[')[-1].split(']')[0]
if key != '':
if 'rxPackets' in line:
rxDict[key] = line.split(':').strip()
key = ''
这个有效:
>>> txt='''\
... RX[0]
... qpn : 0x48
... cqn : 0x80
... rxBytes : 179531811
... rxPackets : 296242
... rxPacketsDropped : 0
... rxCheckSumOk : 225257
... rxCheckSumNone : 200
... RX[1]
... qpn : 0x49
... cqn : 0x81
... rxBytes : 0
... rxPackets : 0
... rxPacketsDropped : 0
... rxCheckSumOk : 0
... rxCheckSumNone : 0**
... '''
>>> import re
>>> re.search(r'RX\[(\d+)\].*?rxPackets\s+:\s+(\d+)', txt, re.S).groups()
('0', '296242')
或者,使用 findall:
>>> re.findall(r'RX\[(\d+)\].*?rxPackets\s+:\s+(\d+)', txt, re.S)
[('0', '296242'), ('1', '0')]
与.*
的贪婪形式比较:
>>> re.findall(r'RX\[(\d+)\].*rxPackets\s+:\s+(\d+)', txt, re.S)
[('0', '0')]
您可以在此处直观地看到 greedy and not greedy