根据字符串中特定的逗号,将字符串拆分为元组列表

3

I have a long Python string of the form:

string='Black<5,4>, Black<9,4>'

我该如何将这个字符串以及任何形式相同(即<ArbitraryString1<ArbitraryListOfIntegers1>,<ArbitraryString2<ArbitraryListOfIntegers2>,...)的任意长度的字符串拆分为元组列表。请保留HTML标记。以下是字符串的期望输出:
list_of_tuples=[('Black',[5,4]),'Black,[9,4])

通常我会在逗号上使用 string.split 生成一个列表,然后使用正则表达式将单词与 <> 分开,但由于我需要使用逗号来分隔我的索引(即 <> 的内容),所以这种方法不起作用。


字符串的格式总是这样的吗? - dot.Py
1
第一个分割是否不可能使用逗号和空格的 ', ' 分隔符,而不仅仅是逗号? - Tryph
3个回答

6
你可以使用正则表达式来捕获在一个 < 前的一个或多个单词字符,并将 <...> 中的所有内容捕获到另一个组中,然后使用 , 将 Group 2 的内容拆分为整数值:
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个或以上字符
  • > - 字面意义的>

2

或者,您可以手动在未包含<,>的逗号上进行分割,然后稍后处理这些部分:

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)

2
你可以在", "(注意空格)处进行分割,然后处理数据。 示例代码:
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'])]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接