【问题标题】:Is there other method to get the result in python是否有其他方法可以在 python 中获取结果
【发布时间】:2020-10-31 05:58:33
【问题描述】:

下面是输入:

CHPID PATH=(CSS(0,1,2),11),SHARED, NOTPART=((CSS(0),(BP0101),(BP0102),(=)),(CSS(1),(BP0112),(=)),(CSS(2),(BP0121),(=))),SWITCH=11,SWPORT=((11,31))

我希望得到如下结果:

输出:

 {'CSS(0)': ['(BP0101)', '(BP0102)'], 'CSS(1)': ['(BP0112)'], 'CSS(3)': ['(BP0121)']}

我的代码如下:

import re
content ='CHPID PATH=(CSS(0,1,2),11),SHARED, NOTPART=((CSS(0),(BP0101),(BP0102),(=)),(CSS(1),(BP0112),(=)),(CSS(3),(BP0121),(=))),SWITCH=11,SWPORT=((11,31))'
bb1 = "NOTPART" +".*"+ "\(=\)\)\)"
PART01 = re.compile(bb1)
matchb = PART01.search(content)
startxx = matchb.start() +9
endxx = matchb.end() -1
xxx = content[startxx:endxx]
bb00 = {}
bb01 = {}
larp00 = []
xxx1 = xxx.split(',')
for ii in range(len(xxx1)):
    if xxx1[ii][1:4] == 'CSS' :
        cs00 = xxx1[ii][1:]
    elif xxx1[ii][1:2] !=  '=':
        larp00.append(xxx1[ii])
    else:
        bb00 = {cs00:larp00}
        bb01.update(bb00)
        larp00=[]
print(bb01)

还有其他方法可以像使用正则表达式一样在 python 中获取结果吗?如何解析数据?

欢迎提出任何建议!

非常感谢!

蔡崇信

【问题讨论】:

    标签: python regex parsing


    【解决方案1】:
    import re
    content = 'CHPID PATH=(CSS(0,1,2),11),SHARED, NOTPART=((CSS(0),(BP0101),(BP0102),(=)),(CSS(1),(BP0112),(=)),(CSS(3),(BP0121),(=))),SWITCH=11,SWPORT=((11,31))'
    r = re.compile(r'(CSS\(\d\).+?(?=.\(=\)))')
    s = r.findall(content)
    
    z = {j[0]: j[1:] for i in s for j in [i.split(',')]}
    print(z)
    
    {'CSS(0)': ['(BP0101)', '(BP0102)'], 'CSS(1)': ['(BP0112)'], 'CSS(3)': ['(BP0121)']}
    

    【讨论】:

    • 亨利感谢您的回复!你的代码非常棒!
    【解决方案2】:

    有两个输入: 输入1:

    CHPID PATH=(CSS(0,1,2),11),SHARED, NOTPART=((CSS(0),(BP0101),(BP0102),(=)),(CSS(1),(BP0112),(=)),(CSS(2),(BP0121),(=))),SWITCH=11,SWPORT=((11,31))'
    

    我想出去1:

    {'CSS(0)': ['(BP0101)', '(BP0102)'], 'CSS(1)': ['(BP0112)'], 'CSS(2)': ['(BP0121)']}
    

    Henry 帮我重新编码

    输入2:

      LNUM  LNAME     TYPE  DESC CSS(0) BP01 PRODUCTION-BP01  010F383906
      1 BP0101 OS PLEXNP1-NP1A
      2 BP0102 OS PLEXNP1-NP1B
      3 BP0103 OS PLEXNP1-NP1G
      4 BP0104 OS DRI VER
      LNUM  LNAME     TYPE  DESC        CSS(1) BP01 TEST-BP01  010F383906
      1 BP0111 OS PLEXNP1-TEST-NP1E
      2 BP0112 OS PLEXNP1-TEST-NPK1
      3 BP0113 OS PLEXNP1-TEST-NP1J
      LNUM  LNAME     TYPE  DESC        CSS(2) BP01 TEST-BP01  010F383906
      1 BP0121 OS PLEXNP2-TEST-NP2E
      2 BP0122 OS PLEXNP2-TEST-NPK2
      3 BP0123 OS PLEXNP2-TEST-NP2J
    

    我要出局2:

     {'CSS(0)': ['(BP0101)', '(BP0102)', '(BP0103)', '(BP0104)'], 'CSS(1)':   ['(BP0111)', '(BP0112)', '(BP0113)'], 'CSS(2)': ['(BP0121)', '(BP0122)', '(BP0123)']}
    

    最后我想比较 OUT1 和 OUT2 来更新 input1 得到如下结果:

    CHPID PATH=(CSS(0,1,2),11),SHARED, PARTITION=((CSS(0),(BP0103),(BP0104),(=)),(CSS(1),(BP0111),(BP0113),(=)),(CSS(2),(BP0122),(BP0123),(=))),SWITCH=11,SWPORT=((11,31))
    

    下面是代码:

      import re
      # Henry Tjhia's code
      content = 'CHPID PATH=(CSS(0,1,2),11),SHARED, NOTPART=((CSS(0),(BP0101),(BP0102),(=)),(CSS(1),(BP0112),(=)),(CSS(2),(BP0121),(=))),SWITCH=11,SWPORT=((11,31))'
      r = re.compile(r'(CSS\(\d\).+?(?=.\(=\)))')
      s = r.findall(content)
    
      z = {j[0]: j[1:] for i in s for j in [i.split(',')]}
      print('out1:',z)
    
      # Henry Tjhia's code above
    
      regex = re.compile('\s+')
      content1 = '''LNUM  LNAME     TYPE  DESC CSS(0) BP01 PRODUCTION-BP01    010F383906
      1 BP0101 OS PLEXNP1-NP1A
      2 BP0102 OS PLEXNP1-NP1B
      3 BP0103 OS PLEXNP1-NP1G
      4 BP0104 OS DRI VER
      LNUM  LNAME     TYPE  DESC        CSS(1) BP01 TEST-BP01  010F383906
      1 BP0111 OS PLEXNP1-TEST-NP1E
      2 BP0112 OS PLEXNP1-TEST-NPK1
      3 BP0113 OS PLEXNP1-TEST-NP1J
      LNUM  LNAME     TYPE  DESC        CSS(2) BP01 TEST-BP01  010F383906
      1 BP0121 OS PLEXNP2-TEST-NP2E
      2 BP0122 OS PLEXNP2-TEST-NPK2
      3 BP0123 OS PLEXNP2-TEST-NP2J'''
    
      a=[]
      b = {}
      cc = {}
      cs=[]
      line = 0
      item = content1.split('\n')
      while line < len(item):
        if len(item[line]) > 0:
          a = regex.split(item[line])
          if  'TYPE'  in a:
               ccs = a[4].strip()
               line = line + 1
               a = regex.split(item[line])
               while 'TYPE' not in a:
                  cs.append("("+a[1]+")")
                  line =line+1
                  if line < len(item):
                     a = regex.split(item[line])
                  else:
                      break
               b={ccs : cs}
               cc.update(b)
               cs =[]
               print('out2:',cc)
    
    
    
      for key1, value1 in cc.items():
          for key2, value2 in z.items():
            if key1 == key2:
              list1 = cc[key1]
              list2 = z[key1]
              unique = [mm1 for mm1 in list1 if mm1 not in list2]
              print ('diff:',key1,unique)
              uuu =','.join(unique)
              part00 = key1 +','+','.join(z[key1])
              repl00 =  key1 + ',' + uuu
              content = content.replace(part00,repl00)
              part00=''
              repl00=''
              uuu=''
      content = content.replace('NOTPART','PARTITION')
      print('new:',content)
    

    你能帮我简化这段代码吗?非常感谢!

    杰森蔡

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 2020-08-15
      • 2018-06-17
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多