首页 > 解决方案 > 如何在 python 中使用正则表达式获取 RPM 安装的包名称和版本

问题描述

我想解析rpm -qa输出以获取包名称和版本信息。我的想法是搜索第一次出现的r'(-\w+\.)'(这个正则表达式应该匹配第一次出现在'-'和'.'之间的子字符串)并用它拆分数据。第一部分将是包名称,匹配的正则表达式与第二部分连接的省略“-”将是版本。

例子:

如何在 python 中实现这一点,是否有任何替代方法来识别包名称和版本?

boost-license-1.36.0-12.3.1 -> boost-license 和 1.36.0-12.3.1

yast2-schema-2.17.5-0.5.42 -> yast2-schema 和 2.17.5-0.5.42

发行说明-sles-11.3.34-0.7.1 -> 发行说明-sles 和 11.3.34-0.7.1

yast2-country-data-2.17.55-0.7.1 -> yast2-country-data 和 2.17.55-0.7.1

代码部分:

command = 'rpm -qa'
pkgList = []
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
    client.connect('ipaddress', username='user', password='pwd')
except SSHException as error:
    print (str(error) + "\n"+ "Authentication error")
else:
    stdin, stdout, stderr = client.exec_command(command)
    for line in stdout:
        pkgList.append(line.strip('\n'))
    for line in stderr:
        print('' + line.strip('\n'))

标签: regexpython-3.x

解决方案


很高兴您可以解决部分问题,我已经为您解决了另一半:这是它的简单功能:

def slicer(pkgList):
    #Description: Take packages and slice them into package names and versions
    #Param: pkgList:python list - takes a python list and returns a dict with
    #package name as keys and versions as values

    items = pkgList
    packages = {}
    non_packages = []
    for item in items:
        target = re.search('(-\d+\.)', item)
        try:
            start = item.index(target.group(0))

            package_name = item[:start]
            package_version = item[start+1:]
            packages[package_name] = package_version
        except:
            non_packages.append(item)
    print('Non Packages:\n',non_packages)
    return packages
#returned value is a dict so to get the packages
#packages = slicer(pkgList)
#for names,versions in packages.items():
#    print(names,'\t',versions)

希望这有帮助这是我的输出 在这里查看


推荐阅读