Python Regex多组模式findall()返回空列表

时间:2017-12-09 04:44:26

标签: python regex

我正在尝试使用Regex多组模式从一行中提取不同的CPU规格,但获得一个空列表。当我单独尝试单个组时,我能够提取相应的值。我该如何在这里使用多组模式?请帮忙!

import re

line = "R7000 CPU at 160MHz, Implementation 39, Rev 2.1, 256KB L2, 512KB L3 Cache"

pat_cpu_values_combined = r"(?P<freq>\s+\w+Hz)(?P<L2>\s+\w+\s+L2)(?P<L3>\s+\w+\s+L3)"
pat_cpu_freq = r"(?P<freq>\s+\w+Hz)"
pat_cpu_l2 = r"(?P<L2>\s+\w+\s+L2)"
pat_cpu_l3 = r"(?P<L3>\s+\w+\s+L3)"

# empty list coming when pat_cpu_values_combined is searched

print re.findall(pat_cpu_values_combined, line)

# below individual group pattern findall are working fine

print re.findall(pat_cpu_freq, line)
print re.findall(pat_cpu_l2, line)
print re.findall(pat_cpu_l3, line)

3 个答案:

答案 0 :(得分:1)

你的组合正则表达式正在寻找每个拼凑在一起的模式,没有中间字符。您可以将模式与|分隔符组合在一起。

pat_cpu_values_combined = r"(?P<freq>\s+\w+Hz)|(?P<L2>\s+\w+\s+L2)|(?P<L3>\s+\w+\s+L3)"

[''.join(g) for g in  re.findall(pat_cpu_values_combined, line)]
# returns:
[' 160MHz', ' 256KB L2', ' 512KB L3']

答案 1 :(得分:0)

组合它们时,您不会考虑要匹配的事物之间的字符。尝试将此用于组合正则表达式:

(?P<freq>\s+\w+Hz).*?(?P<L2>\s+\w+\s+L2).*?(?P<L3>\s+\w+\s+L3)

答案 2 :(得分:0)

pat_cpu_values_combined期望与您的三个单独模式匹配的字符串在它们之间没有任何内容。

如果您想按顺序查找所有三个,请使用以下内容:

pat_cpu_values_combined = r"(?P<freq>\s+\w+Hz).*?(?P<L2>\s+\w+\s+L2).*?(?P<L3>\s+\w+\s+L3)"