我想解析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'))
答案 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)
答案 1 :(得分:0)
我已经在python中实现了这一点。我正在从列表中删除没有正则表达式匹配的项目。
例如:gpg-pubkey-307e3d54
有一个理由使用一个以上的列表removedList
从pkgList
中删除元素。直接从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]