繁体   English   中英

解析Python的输出

[英]Parse Output for Python

我的软件输出这两种类型的输出:

-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 ,第二个

如果我使用类似下面的代码,如果第二个参数中有空格,它将无法工作。 如果域用户名中没有任何空格,则它可以工作。

for item in outputs:
    outputs.extend(item.split())
for item2 in [' '.join(outputs[6:])]:
    new_list.append(item2)

如何单独获取所有参数,包括文件名?

如果正则表达式是一个选项:

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 (.*)"查找linestart '^' +尽可能减少任何事情'.*?' +时间戳'\\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

你可以使用像这样的正则表达式

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

除了使用正则表达式,您可以尝试类似于此的东西。

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的问题。 这仅包括捕获文件路径。 如果有人觉得它有用,我会在这里留下这个答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM