【问题标题】:Catch multiple string occurrences in multiline text捕获多行文本中出现的多个字符串
【发布时间】:2015-05-12 16:12:55
【问题描述】:

我已经有一段时间了,我正在尝试从中提取一些值 使用 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)

但我希望使用单个正则表达式模式来做到这一点。 谁能帮我解释一下如何做到这一点?

【问题讨论】:

  • 我怀疑 findall 会返回一个包含所有实例的列表。您只需索引列表即可找到(例如)您想要的 rxPackets
  • 它返回一个列表,其中包含 1 个元素、第一个索引和最后一个 rxPackets 值。

标签: python regex string findall


【解决方案1】:

这行得通:

>>> 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')]

greedynot greedy 可以在此处直观地看到

【讨论】:

  • 我试图获取一个包含所有块的元组的列表 [('0',296242'),('1','0')....]
  • 在我发布的示例中没有 findall 这样做吗?
  • 关键是使用非贪婪.*? vs 贪婪.*
【解决方案2】:

我太笨了,无法使用正则表达式来解决这个问题。

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 = ''

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    相关资源
    最近更新 更多