[英]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.