首页 > 解决方案 > 如何解析用空格分隔的文本输出

问题描述

第一行是字段名称。其他是值,但如果没有对应的数据,则值用空格填充。特别是 和中bindings没有值。 没有价值SHORTNAMESAPIGROUPpodsAPIGROUP

$ kubectl api-resources
NAME                              SHORTNAMES   APIGROUP                       NAMESPACED   KIND
bindings                                                                      true         Binding
pods                              po                                          true         Pod
deployments                       deploy       apps                           true         Deployment

最后,我想将输出数据视为 python dict,其中 key 是字段名称。首先,它似乎用正则表达式的虚拟值替换了无间隔的值。

NAME                              SHORTNAMES   APIGROUP                       NAMESPACED   KIND
bindings                           no-value        no-value                  true         Binding

有可能吗?

标签: pythonregexshellkubectl

解决方案


这是正则表达式的解决方案。

import re

data = """NAME                              SHORTNAMES   APIGROUP                       NAMESPACED   KIND
bindings                                                                      true         Binding
pods                              po                                          true         Pod
deployments                       deploy       apps                           true         Deployment"""

regex = re.compile(
    "(?P<name>\S+)\s+"
    "(?P<shortname>\S+)\s+"
    "(?P<group>\S+)\s+"
    "(?P<namespace>\S+)\s+"
    "(?P<kind>\S+)"
)
header = data.splitlines()[0]

for match in regex.finditer(header):
    name_index = match.start('name')
    shortname_index = match.start('shortname')
    group_index =  match.start('group')
    namespace_index =  match.start('namespace')
    kind_index =  match.start('kind')

def get_text(line, index):
    result = ''
    for char in line[index:]:
        if char == ' ':
            break
        result += char
    if result:
        return result
    else:
        return "no-value"

resources = []
for line in data.splitlines()[1:]:
    resources.append({
        "name" : get_text(line, name_index),
        "shortname": get_text(line, shortname_index),
        "group": get_text(line, group_index),
        "namespace": get_text(line, namespace_index),
        "kind": get_text(line, kind_index)
    })
print(resources)

输出是(格式化的):

[
    {
        'name': 'bindings',
        'shortname': 'no-value',
        'group': 'no-value',
        'namespace': 'true',
        'kind': 'Binding'
    },
    {
        'name': 'pods',
        'shortname': 'po',
        'group': 'no-value',
        'namespace': 'true',
        'kind': 'Pod'
    },
    {
        'name': 'deployments',
        'shortname': 'deploy',
        'group': 'apps',
        'namespace': 'true',
        'kind': 'Deployment'
    }
]

推荐阅读