从字符串中读取参数值

Reading parameter value from a string

假设我有一个字符串列表,如下所示:

strings_list = ["a=2,b=3,c=14","a=1,b=4,c=0","a=1,b=80,c=3"]

我想遍历这些字符串并读取 'b' 参数的值。我该怎么做呢?你能帮我填写一下我写的评论行吗

b_array = []
For s in strings_list:
   # [read off b parameter as a number, call it b_value]
   b_array.append(b_value)

使用正则表达式

import re

strings_list = ["a=2,b=3,c=14","a=1,b=4,c=0","a=1,b=80,c=3"]

b_array = []
for s in strings_list:
    for match in re.finditer(r'([^=,]+)=([^,]+)', s):
        name, value = match.groups()
        if name == 'b':
            b_array.append(value)

print(b_array)
# ['3', '4', '80']

或更通用的方法,以防您需要“b”以外的其他参数:

from collections import defaultdict
import re

strings_list = ["a=2,b=3,c=14","a=1,b=4,c=0","a=1,b=80,c=3"]

parameters = defaultdict(list)

for s in strings_list:
    for match in re.finditer(r'([^=,])+=([^,])', s):
        name, value = match.groups()
        parameters[name] += [value]


print(parameters['b'])
# ['3', '4', '8']

您可以做的一个可能的解决方案是遍历 strings_list 并针对每个元素,用逗号将其分成一个列表。然后你只需取第二个元素,减去 b=,并将剩余的数字转换为整数。代码如下所示:

strings_list = ["a=2,b=3,c=14","a=1,b=4,c=0","a=1,b=80,c=3"]
b_array = []
for s in strings_list:
   splitted = s.split(",")
   b_array.append(int(splitted[1][2:]))
print(b_array) # Returns [3, 4, 80]

如果你不想让b_array填入整数,而是填入b值的字符串,只需要去掉转为整数的部分即可。

您可以在 , 上拆分每个字符串,然后在 = 上再次拆分,如果拆分的第一部分是 b(或其他名称),则保存值:

name = 'b'
result = [int(v[1]) for v in [a.split('=') for s in strings_list for a in s.split(',')] if v[0] == name]

输出(对于您的示例数据):

[3, 4, 80]

您也可以采用@Thefourthbird 所示的regex-based 方法,并使用defaultdict 一次提取所有参数的所有值:

import re
from collections import defaultdict

p = defaultdict(list)
[p[k].append(int(v)) for (k, v) in re.findall('(\w+)=(\d+)', ','.join(strings_list))]

输出(对于您的示例数据):

{
 'a': [2, 1, 1],
 'b': [3, 4, 80],
 'c': [14, 0, 3]
}

您可以捕获密钥等于 b 的组中的数字,然后使用 re.findall 获取所有组匹配项。

strings_list = ["a=2,b=3,c=14", "a=1,b=4,c=0", "a=1,b=80,c=3"]
b_array = []

[b_array.extend(re.findall(r"\bb=(\d+)", s)) for s in strings_list]

print(b_array)

输出

['3', '4', '80']