从字符串中读取参数值
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']
假设我有一个字符串列表,如下所示:
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']