Python正则表达式re.search转为列表

3

我有一些代码用于解析Linux的“df -h”命令,正常的命令行输出如下:

Filesystem      Size  Used Avail Use% Mounted on
udev            987M     0  987M   0% /dev
tmpfs           201M  9.2M  191M   5% /run
/dev/sda1        38G   11G   25G  30% /
tmpfs          1001M  416K 1000M   1% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs          1001M     0 1001M   0% /sys/fs/cgroup
tmpfs           201M   28K  201M   1% /run/user/132
tmpfs           201M   28K  201M   1% /run/user/0

目前我的代码已经实现了所需的输出:

['/run', '/run/lock', '/run/user/132', '/run/user/0']

但是下面显示的 'print ([x.split(" ")[-1] for x in newlist])' 这一行感觉像是一个hack,我正在努力使用下面的 'r.search' 将其作为正则表达式运行,有没有人能够建议更好的方法呢?

import subprocess
import re


cmd = 'df -h'
output = subprocess.check_output(cmd, shell=True).decode('utf8')
ln = output.split('\n')
r = re.compile('/run.*')
newlist = list(filter(r.search, ln))

print ([x.split(" ")[-1] for x in newlist])

编辑 * 我正在使用“df -h”作为一些随机输出来练习正则表达式,因此尽管@romanPerekhrest提供了最佳的现实解决方案,但我正在寻找一个正则表达式解决方案。


1
实际上,我认为你的解决方案比正则表达式更好(而且几乎肯定更快)。 - Błotosmętek
2个回答

3
最快捷的方法是:
df -h --output=target | grep '/run.*'

输出结果:
/run
/run/lock
/run/user/132
/run/user/0
  • --output=target - 输出仅挂载点信息。

谢谢您的回复,不过我正在使用“df”工具作为在Python中解析命令输出的练习。 - biscuitlover
@biscuitlover,很简单:如果你想继续使用Python,你现在的脚本将被简化为cmd = "df -h --output=target | grep '/run.*'" output = subprocess.check_output(cmd, shell=True).decode('utf8') lines = output.split('\n') - RomanPerekhrest
这是更好的现实世界解决方案,但我使用“df -h”作为一些随机输出来执行正则表达式,我应该在我的原始问题中提到它,再次感谢。 - biscuitlover
@biscuitlover,是的,我倾向于建议真正的解决方案。 - RomanPerekhrest

2
如何?
re.findall(r'/run.*$', output, re.MULTILINE)

我不知道更好或更快,但它将您的代码缩减为3行,并且您已经在使用正则表达式。


谢谢您,这正是我想要实现的! - biscuitlover
公平地说,@romanPerekhrest 的那个更好。 - Stael
实际上,我对我的原始问题进行了编辑以进行澄清。 - biscuitlover

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