在python中是否还有其他方法可以获得结果

2024-10-03 02:32:21 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是输入:

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中是否有其他方法可以像使用正则表达式一样获得结果?如何解析数据

任何建议都将不胜感激

非常感谢

蔡简森


Tags: pathcontentcssiibb01xxx1matchbbb00
2条回答
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)']}

有两种输入: 输入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)']}

亨利帮我重新编码

输入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)

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

蔡志强

相关问题 更多 >