【问题标题】:How to parse and split a text string and save it as an array of arrays如何解析和拆分文本字符串并将其保存为数组数组
【发布时间】:2021-05-05 14:30:32
【问题描述】:

我有以下字符串,在这个例子中有 4 行,但可能还有更多:

  port  device  name           profile  settings
  ====  ======  =============  =======  =================
  1     ttyS1   name1          cas      9600 8N1 ssh none
  2     ttyS2   name2          cas      9600 8N1 ssh none
  3     ttyS3   name3          cas      9600 8N1 ssh none
  4     ttyS4   name4          cas      9600 8N1 ssh none

Press any key to continue...

我只需要从端口和名称列中获取数据,并将其分配给一个数组数组,或者几个数组。

例如

['1', 'name1']
['2', 'name2']
['3', 'name3']
['4', 'name4']

or

[['1', 'name1'],['2', 'name2'],['3', 'name3'],['4', 'name4']]

谁能给我任何关于如何实现的想法?

【问题讨论】:

标签: python regex string text split


【解决方案1】:

使用您展示的示例,请尝试以下操作。使用Python3.8编写和测试,使用Python的findall函数。

import re
var="""  port  device  name           profile  settings
====  ======  =============  =======  =================
1     ttyS1   name1          cas      9600 8N1 ssh none
2     ttyS2   name2          cas      9600 8N1 ssh none
3     ttyS3   name3          cas      9600 8N1 ssh none
4     ttyS4   name4          cas      9600 8N1 ssh none"""

re.findall(r'^\s+?(\d+).*?\S+\s+(\S+).*$',var,re.M)

输出如下:

[('1', 'name1'), ('2', 'name2'), ('3', 'name3'), ('4', 'name4')]

说明:为上述正则表达式添加详细说明。

^\s+?      ##Checking from starting of value spaces occurrences 1 or more optional.
(\d+)      ##Creating 1st capturing group which has continuous digits in it, port number.
.*?\S+\s+  ##using non greedy match to match till non space value(1 or more) followed by 1 or more spaces.
(\S+)      ##Creating 2nd capturing group which has all non space values(names) in it.
.*$        ##Matching rest of the values here.

【讨论】:

    【解决方案2】:
    import re
    
    txt = """
      port  device  name           profile  settings
      ====  ======  =============  =======  =================
      1     ttyS1   name1          cas      9600 8N1 ssh none
      2     ttyS2   name2          cas      9600 8N1 ssh none
      3     ttyS3   name3          cas      9600 8N1 ssh none
      4     ttyS4   name4          cas      9600 8N1 ssh none
    
    Press any key to continue...
    """
    
    r = re.compile(r"^[^\d]+(\d+)\s*[^\s]+\s*([^\s]+)", flags=re.M)
    
    out = r.findall(txt)
    print(out)
    

    打印:

    [('1', 'name1'), ('2', 'name2'), ('3', 'name3'), ('4', 'name4')]
    

    【讨论】:

      【解决方案3】:

      其他用户已经回复了最佳解决方案,但这是我的简单解决方案:D

      stringOrig = """
        port  device  name           profile  settings
        ====  ======  =============  =======  =================
        1     ttyS1   name1          cas      9600 8N1 ssh none
        2     ttyS2   name2          cas      9600 8N1 ssh none
        3     ttyS3   name3          cas      9600 8N1 ssh none
        4     ttyS4   name4          cas      9600 8N1 ssh none
      
      Press any key to continue...
      """
      
      stringLines = stringOrig.split("\n")
      linesContent = stringLines[3:-3]
      lineValues = list(
        map(lambda l: 
            list(
              filter(lambda x : x != "", l.split(" "))
            )[0:3:2]
            , linesContent
        )
      )
      print(lineValues)
      

      【讨论】:

        猜你喜欢
        • 2012-02-02
        • 1970-01-01
        • 1970-01-01
        • 2018-09-20
        • 1970-01-01
        • 1970-01-01
        • 2021-10-13
        • 2016-04-01
        • 1970-01-01
        相关资源
        最近更新 更多