我正在运行一个解析git stash
命令输出的实用程序。我捕获输出并将其发送到我的解析器。这是一个示例:
df
这是功能:
Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on
/dev/disk2 1996082176 430874208 1564695968 22% 2429281 4292537998 0% /
devfs 668 668 0 100% 1156 0 100% /dev
map -hosts 0 0 0 100% 0 0 100% /net
map auto_home 0 0 0 100% 0 0 100% /home
但是我得到以下输出:
def parse_df(self, content):
"""Parse the `df` content output
:param content: The command content output
:return: (list) A list of objects of the type being parsed
"""
entries = []
if not content:
return entries
# Split the content by line and check if we should ignore first line
for line in content.split("\n"):
if line.startswith("Filesystem"):
continue
tokens = line.split()
print tokens
问题是['/dev/disk2', '1996082176', '430876480', '1564693696', '22%', '2429288', '4292537991', '0%', '/']
['devfs', '668', '668', '0', '100%', '1156', '0', '100%', '/dev']
['map', '-hosts', '0', '0', '0', '100%', '0', '0', '100%', '/net']
['map', 'auto_home', '0', '0', '0', '100%', '0', '0', '100%', '/home']
应该是一个单独的元素(对于map -host
列)。
我试图应用正则表达式Filesystem
,但结果仍然不正确:
tokens = re.split(r'\s{2,}', line)
解析输出的正确方法是什么?
答案 0 :(得分:2)
只需拆分一个或多个空格,后面跟一个数字或/
>>> import re
>>> s = '''/dev/disk2 1996082176 430874208 1564695968 22% 2429281 4292537998 0% /
devfs 668 668 0 100% 1156 0 100% /dev
map -hosts 0 0 0 100% 0 0 100% /net
map auto_home 0 0 0 100% 0 0 100% /home'''.splitlines()
>>> for line in s:
print re.split(r'\s+(?=[\d/])', line)
['/dev/disk2', '1996082176', '430874208', '1564695968', '22%', '2429281', '4292537998', '0%', '/']
['devfs', '668', '668', '0', '100%', '1156', '0', '100%', '/dev']
['map -hosts', '0', '0', '0', '100%', '0', '0', '100%', '/net']
['map auto_home', '0', '0', '0', '100%', '0', '0', '100%', '/home']
>>>
答案 1 :(得分:1)
如果这是你想要的行为,我能看到的最简单的方法是加入数组的第一个元素,直到你到达一个数字元素。
这样的事情:
tokens = line.split()
n = 1
while n < len(tokens) and not tokens[n].isdigit():
n += 1
tokens[0] = ' '.join(tokens[:n])
tokens = [ tokens[0] ] + tokens[n:]
或者你可以尝试@ cricket_007的建议:
first_token = line[:15].strip()
tokens = [ first_token ] + [ x.strip() for x in line[15:].split() ]
答案 2 :(得分:0)
由于FS可能会有多个空格,只要您可以预先确定可以使用不同的分隔符进行拆分并最终将它们组合起来。
fs, rest = re.split(r'\s{2,}', line, 1)
result = [fs] + rest.split()
但这不起作用fs
被一个大空间隔开。
同意评论使用os.statvfs(path)
是一个更好的工具。 df
将是subprocess
电话。