Python的输出解析

3

我的软件会产生两种输出结果:

-rwx------ Administrators/Domain Users  456220672   0% 2018-04-16 16:04:40 E:\\_WiE10-18.0.100-77.iso

-rwxrwx--- Administrators/unknown        6677   0% 2018-04-17 01:33:23 E:\\program files\\cluster groups\\sql server (mssqlserver)\\logs\\progress-MOD-1523883344023-3001-Windows.log

我想要从两个输出中获取文件名:
  • 对于第一个输出是E:\\_WiE10-18.0.100-77.iso
  • 对于第二个输出是E:\\program files\\cluster groups\\sql server (mssqlserver)\\logs\\progress-MOD-1523883344023-3001-Windows.log
如果我使用以下代码,当第二个参数有空格时它将无法工作。如果Domain Username没有空格,则可以正常运行。
for item in outputs:
    outputs.extend(item.split())
for item2 in [' '.join(outputs[6:])]:
    new_list.append(item2)

我如何逐个获取所有参数,包括文件名?


2
例如,使用正则表达式\b[A-Z]:\\\\.+ - Jan
3个回答

4
如果正则表达式是一种选择:
text = """-rwx------ Administrators/Domain Users  456220672   0% 2018-04-16 16:04:40 E:\\_WiE10-18.0.100-77.iso

-rwxrwx--- Administrators/unknown        6677   0% 2018-04-17 01:33:23 E:\\program files\\cluster groups\\sql server (mssqlserver)\\logs\\progress-MOD-1523883344023-3001-Windows.log"""

import re

for h in re.findall(r"^.*?\d\d:\d\d:\d\d (.*)",text,flags=re.MULTILINE):
    print(h)

输出:

E:\_WiE10-18.0.100-77.iso
E:\program files\cluster groups\sql server (mssqlserver)\logs\progress-MOD-1523883344023-3001-Windows.log

模式说明:

模式r"^.*?\d\d:\d\d:\d\d (.*)"查找行首'^'+尽可能少的任何字符'.*?'+时间戳'\d\d:\d\d:\d\d '后跟一个空格,将其后面的所有内容直到行末捕获到一个组中。

它使用了re.MULTILINE标志。


编辑:

捕获各个部分需要一些额外的捕获组:

import re

for h in re.findall(r"^([rwexXst-]+) ([^0-9]+) +\d+.+? +(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (.*)",text,flags=re.MULTILINE):
#                       ^^^^^^^^^^^^ ^^^^^^^^           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^
#                          flags     grpName                               datetime          filename
    for k in h:
        print(k)
    print("")

输出:

-rwx------
Administrators/Domain Users 
2018-04-16 16:04:40
E:\_WiE10-18.0.100-77.iso

-rwxrwx---
Administrators/unknown       
2018-04-17 01:33:23
E:\program files\cluster groups\sql server (mssqlserver)\logs\progress-MOD-1523883344023-3001-Windows.log

我该如何单独获取所有参数,就像如果我只需要权限(第一个)和日期时间一样? - PanDe
1
@PetPan,您需要更多的捕获组。看这里:https://regexr.com/3oart .. 使用类似于 '^([rwexXst-]+) ([^0-9]+) +\d+.+? +(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (.*)' 的表达式,1到4组将给您不同的捕获组。 - Patrick Artner
如果我可以问一个最终编辑的问题,我如何获得文件大小以及所有其他详细信息?在这种情况下,文件大小为:456220672和6677。 - PanDe
1
@PetPan 看一下正则表达式 - 目前没有捕获文件大小:将正则表达式更改为 re.findall(r"^([rwexXst-]+) ([^0-9]+) +(\d+) .+? +(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (.*)",text,flags=re.MULTILINE): - Patrick Artner
1
我稍微修改了一下,以获取完整的文件大小,你的正则表达式在以下部分缺少+号:^([rwexXst-]+) ([^0-9]+) +(\d+).... 现在它可以工作了,再次感谢。干杯 - PanDe
显示剩余3条评论

2

您可以使用正则表达式,例如

\b[A-Z]:\\\\.+

1
除了使用正则表达式外,您可以尝试类似于这样的东西。
output = '-rwx------ ... 2018-04-16 16:04:40 E:\\\\_WiE10-18.0.100-77.iso'

drive_letter_start = output.find(':\\\\')
filename = output[drive_letter_start - 1:]

它查找第一个出现的':\\',并获取子字符串(即':\\')之前的驱动器号以及子字符串之后的完整文件路径。 编辑
Patrick Artner的答案比这个答案更好,完全回答了OP的问题。这仅涵盖捕获文件路径。如果有人发现此答案有用,我将保留此答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接