[英]Split a string into a list of tuples based selectively on specific commas within the string
我有一个长形式的Python字符串:
string='Black<5,4>, Black<9,4>'
如何将此字符串以及具有相同形式的任意其他长度(即<ArbitraryString1<ArbitraryListOfIntegers1>,<ArbitraryString2<ArbitraryListOfIntegers2>,...
)拆分为元组列表。
例如,以下是string
的所需输出:
list_of_tuples=[('Black',[5,4]),'Black,[9,4])
通常我会在逗号上使用string.split
来生成一个列表,然后使用正则表达式将该单词与<>
分开但是因为我需要使用逗号来分隔我的索引( <>
的内容),这不是工作。
您可以使用正则表达式在<
之前捕获1+个字符,并将<...>
内的所有内容捕获到另一个组中,然后将第2组内容拆分为,
将值转换为int:
import re
s='Black<5,4>, Black<9,4>'
print([(x, map(int, y.split(','))) for x,y in re.findall(r'(\w+)<([^<>]+)>', s)])
# => [('Black', [5, 4]), ('Black', [9, 4])]
请参阅Python演示
图案细节 :
(\\w+)
- 组1(分配给x
):1个或多个单词字符 <
- 文字<
([^<>]+)
- 第2组(分配给y
):除<
和>
之外的1+个字符 >
- 文字>
。 或者,您可以手动拆分未包含在<,>
逗号,然后再处理这些部分:
string = 'Black<5,4>, Black<9,4>'
chunks = []
s = string + ','
N = len(s)
pos, level = 0, 0
for i in range(0, N):
if s[i] == '<':
level += 1
elif s[i] == '>':
level -= 1
elif s[i] == ',':
if level == 0:
chunks.append(s[pos:i])
pos = i+1
print(chunks)
您可以拆分为", "
(注意空格),然后处理数据。
示例代码:
string='Black<5,4>, Black<9,4>'
splitted_string = string.split(', ')
list_of_tuples = []
for s in splitted_string:
d = s.replace("<", " <").split()
color = d[0]
n1 = d[1].replace("<", "").replace(">","").split(",")[0]
n2 = d[1].replace("<", "").replace(">","").split(",")[1]
t = (d[0], [n1, n2])
list_of_tuples.append(t)
print(list_of_tuples)
输出:
[('Black', ['5', '4']), ('Black', ['9', '4'])]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.