2017-05-22 16 views
3

文字列内の特定のカンマに基づいてタプルのリストに文字列:スプリット選択私は、フォームの長いPython文字列持つ

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

私は、この文字列を分割することができますどのようにして、任意の長さの任意の他のどのタプルのリストに同じ形式(すなわち、<ArbitraryString1<ArbitraryListOfIntegers1>,<ArbitraryString2<ArbitraryListOfIntegers2>,...)があります。

list_of_tuples=[('Black',[5,4]),'Black,[9,4]) 

通常、私は<>からではなく、私ので、単語を区切るためにリストして、正規表現を生成するために、カンマでstring.splitを使用したい:

は例えば、以下はstringから所望の出力になります私のインデックス(<>の内容)を区切るためにカンマを使用する必要がありますが、これは機能しません。

+0

文字列は、常にこの形式で来るのだろうか? –

+1

最初の分割の昏睡だけではなく、 ''、 ''(昏睡と宇宙)区切り記号でsplitを使うことはできませんか? – Tryph

答えて

6

あなたは<前1+ワード文字をキャプチャし、別のグループに<...>内部のすべてのものをキャプチャして、int型に値をキャスト,とグループ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 demo

パターンは詳細:

  • (\w+) - (xに譲渡された)グループ1:1以上の単語文字
  • <
  • から ([^<>]+)
  • <リテラル - ( yに譲渡された)グループ2: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

あなたは", "で分割(空白に注意してください)し、データをproccessすることができます。

コード例:

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'])] 
関連する問題