2017-12-31 275 views
0

辞書の値を使って特定の文字列をどのように抽出できるかを理解しようとしています。文字列と整数を辞書に抽出する

例:

ShirtType: 11, 14 
variance: 11,12,13,14,15 
color: Red 

は、正規表現を使用してのアイデアを愛し、それはPythonで実現することができる方法を見て思い

item SHIRT 11-14 variance 11-12-13-14-15 color Red

?すべてのアイデアは大歓迎です。

+2

のみ**バージョンspecifc質問はpython2 /のpython3タグを使用します**。 –

+1

は 'item SHIRT'、' variance'、 'color'部分のテキストは常に静的ですか? – user1767754

+0

希望の結果を得るために[one-liner solution](https://stackoverflow.com/a/48045525/2063361)を追加しました –

答えて

1

ご入力はあなたが値を抽出し、辞書にそれらを挿入するためにregexを使用できることを好きで、常にされている場合:

import re 

dic = {} 
input = 'item SHIRT 11-14 variance 11-12-13-14-15 color Red' 
dic['Shirt Type'] = re.search('(?<=SHIRT\s)[\d-]+', input).group().split('-') 
dic['Variance'] = re.search('(?<=variance\s)[\d-]+', input).group().split('-') 
dic['Color']= re.search('(?<=color\s)\w+', input).group().split('-') 
print(dic) 

結果は辞書が3 keys、ea

{'Shirt Type': ['11', '14'], 'Variance': ['11', '12', '13', '14', '15'], 'Color': ['Red']} 
+0

dic ['Color'] = re.search( '(?<= color \ s )\ w + '、input).group()。split(' - ')しかし、TypeErrorとしてエラーが発生する:期待される文字列またはバイトのようなオブジェクト。色の配列型ではありませんか?それは常に1つの色を持っているので – kforkarim

+0

'split( ' - ')'を削除して文字列 – MehrdadEP

+0

を返すようにして、実際には入力を使用していて、宣言された文字列自体で置き換えてください。 – kforkarim

1

regexの式を使用して、文字列から必要な値を抽出することができます。ここで取得するワンライナーですdict希望:各正規表現パターンの

{'color': 'Red', 'variance': ['11', '12', '13', '14', '15'], 'shirt': ['11', '14']} 

説明

# For shirt: 
#  This regex matches the number and hyphen "-" 
#  preceded by "variance" and space " " 
>>> re.search('(?<=SHIRT\s)[\d-]+', my_str).group() 
'11-14'  

# For variance: 
#  Same as the above regex, it matches the number and hyphen "-" 
#  preceded by "SHIRT" and space " " 
>>> re.search('(?<=variance\s)[\d-]+', my_str).group() 
'11-12-13-14-15' 

# For color: 
#  This regex matches the alphabets followed by "color" and space " " 
>>> re.search('(?<=color\s)\w+', my_str).group() 
'Red' 

これを使用するようdictオブジェクトを返します

>>> import re 
>>> my_str = "item SHIRT 11-14 variance 11-12-13-14-15 color Red" 
>>> keys = ["shirt", "variance", "color"] 

>>> {k: v.split('-') if '-' in v else v for k, v in zip(keys, re.findall(
     '(?<=SHIRT\s)[\d-]+|(?<=variance\s)[\d-]+|(?<=color\s)\w+',my_str))} 

明示的に各キーを dictに割り当てることもできます。

1

あなたはこれを試すことができます。

import re 
s = "item SHIRT 11-14 variance 11-12-13-14-15 color Red" 
new_s = s.split()[1:] 
final_data = {"ShirtType" if a == "SHIRT" else a:map(int, b.split('-')) if re.findall('\d\-', b) else b for a, b in [(new_s[i], new_s[i+1]) for i in range(0, len(new_s)-1, 2)]} 

出力:

{'color': 'Red', 'ShirtType': [11, 14], 'variance': [11, 12, 13, 14, 15]} 
0

あなたはまた、正規表現を使用せずに試すことができます:例えば、これはあなたの入力した結果である - CH valueは、(その中に配列のサイズを入力しての数によって異なります)配列となります

一行溶液:

print({line.split()[1:][i:i+2][0]:line.split()[1:][i:i+2][1] for line in open('file.txt','r') for i in range(0,len(line.split()[1:]),2)}) 

出力:

{'color': 'Red', 'variance': '11-12-13-14-15', 'SHIRT': '11-14'} 

詳細バージョン:

with open('file.txt','r') as f: 
    for line in f: 
     chunk=line.split()[1:] 
     print({chunk[i:i+2][0]:chunk[i:i+2][1] for i in range(0,len(chunk),2)}) 
関連する問題