繁体   English   中英

根据字符串中的特定逗号选择性地将字符串拆分为元组列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM