我正在尝试使用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)
答案 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)"