使用正则表达式分析重复输出并为单个键返回多个值

2024-09-30 08:35:59 发布

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

我需要分析以下输出:

|------------------------------|-----------------|----------------------------------------|--------------------|------------|
| Assembly name                | User name       | Path                                   | Start Time         | State      |
|----------127.0.0.1-----------|-----------------|------Shell version 1.2.1-13-09-27------|--------------------|------------|
|ng40core2                     |ng40             |/home/regress/ng40core2                 |2013-10-07 16:55:52 |Running     |
|ng40core1                     |ng40             |/home/regress/ng40core1                 |2013-10-07 16:53:54 |Running     |
|------------------------------|-----------------|----------------------------------------|--------------------|------------|

此输出中可以有多个具有不同版本ng40core的条目。在

我已经为单行编写了正则表达式

^{pr2}$

我想为一个键获取多个值。
对于“ng40core2”-我需要用户名、路径、开始时间和状态
与“ng40core1”相同-我需要用户名、路径、开始时间和状态。在

如果你能提出一个实现这一目标的方法,那将是非常有帮助的。在


Tags: pathname路径home状态时间assemblystart
2条回答

你不需要用regex解析。在

您的文字:

s = """
|               |        -|                    |          |      |
| Assembly name                | User name       | Path                                   | Start Time         | State      |
|     127.0.0.1     -|        -|   Shell version 1.2.1-13-09-27   |          |      |
|ng40core2                     |ng40             |/home/regress/ng40core2                 |2013-10-07 16:55:52 |Running     |
|ng40core1                     |ng40             |/home/regress/ng40core1                 |2013-10-07 16:53:54 |Running     |
|               |        -|                    |          |      |
"""

代码:

^{pr2}$

结果是:

>>> 
ng40core2  ng40  /home/regress/ng40core2  2013-10-07 16:55:52  Running 
ng40core1  ng40  /home/regress/ng40core1  2013-10-07 16:53:54  Running 

为了好玩,我做了一个更健壮的函数:

def retrieve(file_path):
    with open(file_path) as f:
        for assembly_name, user_name, path, start_date, state in parse(f.read()):
            # code
            print assembly_name, user_name, path, start_date, state # example

def parse(text):
    for line in text.splitlines():
        line = [x for x in line.split('|') if x]
        if line and line[0].startswith('ng'):
            yield [x.strip() for x in line]

您可以将re.findall()与regex一起用于所需的行

print re.findall(r'\|(?P<ng40core_instance>\S+)\s+\|(?P<user_name>\S+)\s+\|(?P<path>\S+)\s+\|(?P<start_time>\d+\-\d+\-\d+\s+\d+:\d+:\d+)\s+\|(?P<state>\w+)\s+\|\s*', text)

输出:

[('ng40core2', 'ng40', '/home/regress/ng40core2', '2013-10-07 16:55:52', 'Running'), ('ng40core1', 'ng40', '/home/regress/ng40core1', '2013-10-07 16:53:54', 'Running')]

相关问题 更多 >

    热门问题