每行多个匹配项或使用正则表达式的多行多个匹配项

时间:2020-05-12 16:26:13

标签: python regex

首先:简化的问题。

在以下文本中:

text = b'List ---\r\n\r\nDATA 0:\r\n     SN: 1234656AZDSQVC\r\n     FW: DSQ\r\n\r\nDATA 1:\r\n     SN: 1234ZDS656AQVC\r\n     FW: 656A\r\n\r\n----------------------------------\r\n\r\n\r\n'

我正在寻找两个匹配项,“ 0”然后“ 1”。

我尝试了以下正则表达式

arrayResult = re.findall(".*(?:DATA.*([\d])+.*SN:).*",text)

但是我只得到最后一个匹配:“ 1”,而不是第一个“ 0”。如果我添加更多数据,我总是得到最后一个...

arrayResult: ['1']

下面是完整的问题:

在同一文本中,我实际上正在寻找多个元组匹配:

  • (“ 0”,“ 1234656AZDSQVC”,“ DSQ”)
  • (“ 1”,“ 1234ZDS656AQVC”,“ 656A”)
  • ...
  • (“ 9”,“ 1234ZDS6SXAXXC”,“ 6BBA”)

我尝试了以下正则表达式,但没有成功(我只得到了最后一个元组):

arrayResult = re.findall(r".*(?:DATA.*([\d])+.*SN:[\s]+([\d\w]+).*FW:[\s]+([\d\w]+)).*",text)

找到这些元组的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

这似乎可行:

text = b'List ---\r\n\r\nDATA 0:\r\n     SN: 1234656AZDSQVC\r\n     FW: DSQ\r\n\r\nDATA 1:\r\n     SN: 1234ZDS656AQVC\r\n     FW: 656A\r\n\r\n----------------------------------\r\n\r\n\r\n'
matches = re.findall(r'\b(\d+):.*?\bSN: ([\dA-Z]+).*?FW: ([\dA-Z]+)', text, flags=re.DOTALL)
print(matches)

此打印:

[('1234656AZDSQVC', 'DSQ'), ('1234ZDS656AQVC', '656A')]

我使用的正则表达式模式仅针对前导0:1:节前缀,然后对SN:FW:的内容使用两个捕获组。

不确定您的text字符串。如果以上方法都不适合您,请不要将文本设置为字节字符串。