如何在Python中使用RegularExpression获得RPM安装的软件包名称和版本

时间:2018-10-03 16:55:14

标签: regex python-3.x

我想解析rpm -qa输出以获取软件包名称和版本信息。我的想法是搜索r'(-\w+\.)'的第一次出现(此正则表达式应匹配位于'-'和'。'之间的子字符串的第一次出现)并用它分割数据。第一部分是软件包名称,匹配的正则表达式将带有省略号'-'并与第二部分串联在一起。

示例:

  • boost-license-1.36.0-12.3.1:“-1”。应该是正则表达式匹配部分的第一个出现

  • boost-license:用-1.分割字符串后的第一部分将是程序包名称

  • -1. + 36.0-12.3.1:从匹配的部分中删除'-'并将其添加到第二部分以获取版本。

如何在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

release-notes-sles-11.3.34-0.7.1-> release-notes-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'))

2 个答案:

答案 0 :(得分:1)

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

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)

希望这会有所帮助 这是我的输出 Check it out here

答案 1 :(得分:0)

我已经在python中实现了这一点。我正在从列表中删除没有正则表达式匹配的项目。

例如:gpg-pubkey-307e3d54

有一个理由使用一个以上的列表removedListpkgList中删除元素。直接从pkgList中删除元素会丢失某些元素。

例如:在迭代同一列表时删除元素会丢失某些项目。

for eachPkgVersion in pkgList:
    if(not(p.search(eachPkgVersion))):
        pkgList.remove(eachPkgVersion)

即使我们有以下6个项目,上述代码也只能从“ pkgList”中删除3个项目

输入:

gpg-pubkey-307e3d54
gpg-pubkey-39db7c82
gpg-pubkey-3d25d3d9
gpg-pubkey-50a3dd1c
gpg-pubkey-9c800aca
gpg-pubkey-b37b98a9

输出:列表中仍包含以下项目

gpg-pubkey-39db7c82
gpg-pubkey-50a3dd1c
gpg-pubkey-b37b98a9

完整修复:

p = re.compile('(-\w+\.)')
removedList = []
for eachPkgVersion in pkgListkgList:
    if(not(p.search(eachPkgVersion))):
        removedList.append(eachPkgVersion)
for eachPkgVersion in removedList:
    pkgList.remove(eachPkgVersion)
for eachPkgVersion in pkgList:
    delimitter = p.search(eachPkgVersion).group(1)
    list = eachPkgVersion.split(delimitter)
    pkgName = list[0]
    pkgVerson = delimitter.strip('-') + list[1]