【问题标题】:how to parse a string to match against dictionary?如何解析字符串以匹配字典?
【发布时间】:2016-10-23 16:27:59
【问题描述】:

我有以下代码,仅当“engg_buildinfo”中存在的所有构建位置都与“prod_buildinfo”匹配时,我尝试将“build_info_match”设置为True,目前我相信我遇到了错误,因为prod_buildinfo是一个字符串而不是字典,如何从prod_buildinfo获取对应的构建位置?

代码:-

prod_buildinfo = """|h6. {color:blue} Meta Build{color}|{color:blue}MSM1234.LA.1.9{color}|{color:blue}\\flower\location721\INTEGRATION\CI_MSM1234.LA.1.9-116391-STD.INT-2{color}|
|h6. {color:green}MSM1234{color}|
|h6. GLUE|GLUE.MSM1234.2.0|\\bigelow\zipbuild261\INTEGRATION\GLUE.MSM1234.2.0-00010.1-NOOP_TEST-1|
|h6. PASS|LA.HB.1.3.9|\\flower\location674\INTEGRATION\CI_LA.HB.1.3.9-19602-8x96.1-5|
|h6. MOD|MPSS.TH.2.0.2|\\flower\location678\INTEGRATION\MPSS.TH.2.0.2-00089-M1234FAAAANAAM-1|
|h6. BOOT|BOOT.XF.1.0|\\flower\location675\INTEGRATION\BOOT.XF.1.0-00297-M1234LAB-1|
|h6. TZ|TZ.BF.4.0.1|\\flower\location781\INTEGRATION\TZ.BF.4.0.1-00235-M1234AAAAANAAT-1|
|h6. ADSP|ADSP.1234.2.7.1|\\flower\location714\PROD\ADSP.1234.2.7.1-00121-00355-1|
|h6. SLPI|SLPI.HB.1.0|\\flower\location692\INTEGRATION\SLPI.HB.1.0-00277-M1234AAL-1|
|h6. RPM|RPM.BF.1.6|\\flower\location673\TEST\RPM.BF.1.6-00148-M1234AAAAANAAR-1|
|h6. WIR|WIR.RM.4.3|\\flower\location781\INTEGRATION\WIR.RM.4.3-00092-QCARMSWP-1|
|h6. BF|BF.RM.4.3|\\flower\location698\INTEGRATION\BF.RM.4.3-00022-QCABFSWP-1|
|h6. VIDEO|VIDEO.VE.4.2|\\flower\location682\PROD\VIDEO.VE.4.2-00018-PROD-1|
|h6. CPE_V2|CPE.TSF.2.0|\\flower\location670\INTEGRATION\CPE.TSF.2.0-00003-W9335AAAAAAAAQ-1|
|h6. GI|GI.SPR.1.0|\\nickle\zipbuild165\INTEGRATION\GI.SPR.1.0-10011-GISW-1|
|h6. UNKNOWN|WIR.ADDON_RM.3.0|\\nickle\zipbuild193\PROD\WIR.ADDON_RM.3.0-00013-CNSS_RMZ_WAPI-1|"""

engg_buildinfo = {'TZ':'\\gromit\location1\fw.861','PASS':'\\gromit\apps\pass.61'}

build_info_match = False

for key in engg_buildinfo :
  engg_buildinfo['key'] = prod_buildinfo['key']
  #all the build locations in dict match with buildinfo locations
  build_info_match = True


print build_info_match

输出:-

Traceback (most recent call last):
  File "buildinfo.py", line 27, in <module>
    engg_buildinfo['key'] = prod_buildinfo['key']
TypeError: string indices must be integers, not str

【问题讨论】:

标签: python dictionary


【解决方案1】:

根据我对您的代码的理解,我想出了这个,我认为您可以从这里开始工作,我可以添加更多代码,但我不明白您所说的“dict 中的所有构建位置都与 buildinfo 位置匹配”的意思"

import re
prod_buildinfo = """|h6. {color:blue} Meta Build{color}|{color:blue}MSM1234.LA.1.9{color}|{color:blue}\\flower\location721\INTEGRATION\CI_MSM1234.LA.1.9-116391-STD.INT-2{color}|
    |h6. {color:green}MSM1234{color}|
    |h6. GLUE|GLUE.MSM1234.2.0|\\bigelow\zipbuild261\INTEGRATION\GLUE.MSM1234.2.0-00010.1-NOOP_TEST-1|
    |h6. PASS|LA.HB.1.3.9|\\flower\location674\INTEGRATION\CI_LA.HB.1.3.9-19602-8x96.1-5|
    |h6. MOD|MPSS.TH.2.0.2|\\flower\location678\INTEGRATION\MPSS.TH.2.0.2-00089-M1234FAAAANAAM-1|
    |h6. BOOT|BOOT.XF.1.0|\\flower\location675\INTEGRATION\BOOT.XF.1.0-00297-M1234LAB-1|
    |h6. TZ|TZ.BF.4.0.1|\\flower\location781\INTEGRATION\TZ.BF.4.0.1-00235-M1234AAAAANAAT-1|
    |h6. ADSP|ADSP.1234.2.7.1|\\flower\location714\PROD\ADSP.1234.2.7.1-00121-00355-1|
    |h6. SLPI|SLPI.HB.1.0|\\flower\location692\INTEGRATION\SLPI.HB.1.0-00277-M1234AAL-1|
    |h6. RPM|RPM.BF.1.6|\\flower\location673\TEST\RPM.BF.1.6-00148-M1234AAAAANAAR-1|
    |h6. WIR|WIR.RM.4.3|\\flower\location781\INTEGRATION\WIR.RM.4.3-00092-QCARMSWP-1|
    |h6. BF|BF.RM.4.3|\\flower\location698\INTEGRATION\BF.RM.4.3-00022-QCABFSWP-1|
    |h6. VIDEO|VIDEO.VE.4.2|\\flower\location682\PROD\VIDEO.VE.4.2-00018-PROD-1|
    |h6. CPE_V2|CPE.TSF.2.0|\\flower\location670\INTEGRATION\CPE.TSF.2.0-00003-W9335AAAAAAAAQ-1|
    |h6. GI|GI.SPR.1.0|\\nickle\zipbuild165\INTEGRATION\GI.SPR.1.0-10011-GISW-1|
    |h6. UNKNOWN|WIR.ADDON_RM.3.0|\\nickle\zipbuild193\PROD\WIR.ADDON_RM.3.0-00013-CNSS_RMZ_WAPI-1|"""

engg_buildinfo = {'TZ':'\\gromit\location1\fw.861','PASS':'\\gromit\apps\pass.61'}
prod_buildinfo_dict = {}
# Cleanup unwanted color data like {color:blue} or {color}
prod_buildinfo = re.sub(r'{color.{0,6}}', '', prod_buildinfo)

# Split your file by this string "|h6. "
rows = prod_buildinfo.split("|h6. ")
# Remove the first row because it is empty
rows = rows[1::]

# Create a dictionary from your data
for row in rows:
    #split your rows in columns
    columns = row.split("|")

    #Some data would not have location  
    if len(columns) > 2:
        location = columns[2]
    else:
        location = ""

    # Creating the dictionary
    prod_buildinfo_dict[columns[0]] = location

【讨论】:

  • 理想情况下prod_buildinfo_dict应该看起来像{'GLUE':'\\bigelow\zipbuild261\INTEGRATION\GLUE.MSM1234.2.0-00010.1-NOOP_TEST-1' , 'PASS':'flower\location674\INTEGRATION\CI_LA.HB.1.3.9-19602-8x96.1-5' , 'MOD':'\\flower\location678\INTEGRATION\MPSS.TH.2.0.2-00089-M1234FAAAANAAM-1' ............, 'UNKNOWN':'\\nickle\zipbuild193\PROD\WIR.ADDON_RM.3.0-00013-CNSS_RMZ_WAPI-1'},上面的代码有冗余数据
  • 澄清一下,我们看到了不必要的数据{color:green}MSM1234{color} \nickle\zipbuild193\PROD\WIR.ADDON_RM.3.0-00013-CNSS_RMZ_WAPI-1{color:blue} Meta Build{color} \nickle\zipbuild193\PROD\WIR.ADDON_RM.3.0-00013-CNSS_RMZ_WAPI-1
  • 行上的“{color:color}”数据还是整行?
  • 因此您可以在regexr.com 之类的界面中使用正则表达式来构建一个正则表达式,该表达式将为您提取有效数据 - 否则很难找到包含所有特殊字符的子字符串。
  • @Cristopher - 整行,|h6. {color:blue} Meta Build{color}|{color:blue}MSM1234.LA.1.9{color}|{color:blue}\\flower\location721\INTEGRATION\CI_MSM1234.LA.1.9-116391-STD.INT-2{color}| |h6. {color:green}MSM1234{color}| 从行中删除
猜你喜欢
  • 2015-06-13
  • 2015-12-22
  • 2015-02-02
  • 2012-02-20
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
相关资源
最近更新 更多