将字符串和整数提取到字典

时间:2017-12-31 20:24:55

标签: python regex

我试图理解如何使用其值将特定类型的字符串提取到字典中。

前:

  

项目衬衫11-14方差11-12-13-14-15颜色红色

其中

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

喜欢使用regexp的想法,看看如何在Python中实现这一点?欢迎所有的想法。

4 个答案:

答案 0 :(得分:1)

您可以使用以下regex表达式从字符串中提取所需的值。这是获得所需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对象返回为:

{'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

答案 1 :(得分: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]}

答案 2 :(得分: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的字典,每个value将是一个数组(数组的大小取决于输入和 - 中的数字)例如,这是您输入的结果:

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

答案 3 :(得分:0)

您也可以在不使用正则表达式的情况下尝试:

一线解决方案:

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)})