regex - 如何在 python 中使用正则表达式获取 RPM 安装的包名称和版本
问题描述
我想解析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
发行说明-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'))
解决方案
很高兴您可以解决部分问题,我已经为您解决了另一半:这是它的简单功能:
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)