【问题标题】:Python Regex re.search to listPython Regex re.search 列出
【发布时间】:2017-07-11 15:20:37
【问题描述】:

我有一些代码来解析 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.搜索'下面,有人可以建议一个更好的方法吗?

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 为这个问题提供了最好的现实世界解决方案,但我正在寻找一个正则表达式解决方案。

【问题讨论】:

  • 其实我相信你的解决方案比正则表达式更好(而且几乎可以肯定更快)。

标签: python regex python-3.x


【解决方案1】:

最快的方法:

df -h --output=target | grep '/run.*'

输出:

/run
/run/lock
/run/user/132
/run/user/0

  • --output=target - 只输出挂载点

【讨论】:

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

怎么样

re.findall(r'/run.*$', output, re.MULTILINE)

我不知道更好或速度如何,但它将您的代码减少到 3 行,而且您无论如何都在进行正则表达式。

【讨论】:

  • 谢谢,这正是我想要达到的目标!
  • 公平地说,@romanPerekhrest 的那个客观上更好。
  • 确实,我已经对我原来的问题进行了编辑以供澄清。
猜你喜欢
  • 2013-09-02
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
相关资源
最近更新 更多