繁体   English   中英

如何正确拆分字符串以在 python 中创建字典?

[英]how to properly split string to create dictionary in python?

我有两个字符串

"上衣:棉 + 绣花 (2 Mtr) \n下装:棉 + 纯色 (2 Mtr) \n DUPATTA :雪纺 + 蕾丝 (2 Mtr) \n类型:未缝合\n颜色:多色 \n包含:1顶部有衬里 1 个底部和 1 个 DUPATTA\n原产国:印度"

第二个是

"上衣面料:棉麻布 + 上衣长度:0-2.00\n下布面料:棉麻布 + 下装长度:0-2.00\nDupatta 面料:Nazneen + Dupatta 长度:0-2.00\n衬里面料:棉麻布\n类型:未缝合\ n图案:印刷\n多件装:3 顶\n原产国:印度"

我需要用这两个字符串创建 python 字典,但键在冒号之前

例如,在字符串一键将是

顶部,底部,DUPATTA,类型,颜色,包含,原产国

第二个

键是

顶布,底布,顶长,底长,杜帕塔面料,杜帕塔长度,里料面料,类型,图案,多件装,原产国

到目前为止,我已经使用

keys = ["Top Fabric","Bottom Fabric","Dupatta Fabric","Lining Fabric","Type","Pattern","Multipack","TOP ","BOTTOM ","  DUPATTA ","COLOUR ","CONTAINS ","TYPE ","Country"] 

pattern = re.compile('({})\s+'.format(':|'.join(keys))) 
newdict = dict(zip(*[(i.strip() for i in (pattern.split(desc.replace("*",""))) if i)]*2))

但它不适用于第一个字符串和第二个字符串它没有创建每个键和值

您可以使用匹配第 1 组中冒号之前和第 2 组中冒号之后的部分的正则表达式模式。

然后断言在第 2 组之后,有另一部分以+开头,后跟:或字符串的结尾。

然后创建一个字典,剥离第 1 组和第 2 组的值。

(?:\s*\+\s*)?([^:]+)\s*:\s*([^:]+)(?=\+[^:+]*:|$)

模式匹配:

  • (?:\s*\+\s*)? 可选地匹配可选空白字符之间的+
  • ([^:]+)捕获组 1 ,匹配任何字符,除了:
  • \s*:\s*匹配 a :可选空白字符之间
  • ([^:]+)捕获组 2 ,匹配任何字符,除了:
  • (?=\+[^:+]*:|$)正向前瞻,断言+后跟:向右,或断言字符串的结尾

正则表达式演示| Python 演示

例子

import re
import pprint

pattern = r"(?:\s*\+\s*)?([^:\r\n]+)\s*:\s*([^:\r\n]+)\s*(?=\+[^:+\n]*:|$)"

s = ("TOP : Cotton + Embroidered ( 2 Mtr) \n"
            "BOTTOM : Cotton + Solid (2 Mtr) \n"
            "DUPATTA : Chiffon + Lace Work ( 2 Mtr) \n"
            "TYPE : Un Stitched\n"
            "COLOUR : Multi Colour \n"
            "CONTAINS : 1 TOP WITH LINING 1 BOTTOM & 1 DUPATTA\n"
            "Country of Origin: India\n\n"
            "Top Fabric: Cotton Cambric + Top Length: 0-2.00\n"
            "Bottom Fabric: Cotton Cambric + Bottom Length: 0-2.00\n"
            "Dupatta Fabric: Nazneen + Dupatta Length: 0-2.00\n"
            "Lining Fabric: Cotton Cambric\n"
            "Type: Un Stitched\n"
            "Pattern: Printed\n"
            "Multipack: 3 Top\n"
            "Country of Origin: India")

dictionary = {}
for m in re.finditer(pattern, s, re.MULTILINE):
    dictionary[m.group(1).strip()] = m.group(2).strip()
pprint.pprint(dictionary)

Output

{'BOTTOM': 'Cotton + Solid (2 Mtr)',
 'Bottom Fabric': 'Cotton Cambric',
 'Bottom Length': '0-2.00',
 'COLOUR': 'Multi Colour',
 'CONTAINS': '1 TOP WITH LINING 1 BOTTOM & 1 DUPATTA',
 'Country of Origin': 'India',
 'DUPATTA': 'Chiffon + Lace Work ( 2 Mtr)',
 'Dupatta Fabric': 'Nazneen',
 'Dupatta Length': '0-2.00',
 'Lining Fabric': 'Cotton Cambric',
 'Multipack': '3 Top',
 'Pattern': 'Printed',
 'TOP': 'Cotton + Embroidered ( 2 Mtr)',
 'TYPE': 'Un Stitched',
 'Top Fabric': 'Cotton Cambric',
 'Top Length': '0-2.00',
 'Type': 'Un Stitched'}

您可以尝试以下 dict 理解, s1 代表您的字符串之一:

d={i.split(':')[0].strip(): i.split(':')[1].strip() for i in s1.split('\n')}

编辑:为了使组合字典更容易,您可以定义一个 function:

def f(s1):
    return {i.split(':')[0].strip(): i.split(':')[1].strip() for i in s1.split('\n')}
f('\n'.join([s1,s2])) # single dict from both strings
set(f(s1).keys()).intersection(f(s2).keys()) # common keys 

{'Country of Origin'} 两个集合中的关键公共密钥,但它与印度相同

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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