开发者社区> 问答> 正文

解析conda包装规格清单

我想解析一个规范列表(由conda env export -n base --json --from-history --no-builds返回)来获取软件包和版本的列表。

我写了下面的代码(没有正则表达式),直到'conda-forge :: blas [build = openblas]'被严重解析为'conda-forge :: blas [build“:{'openblas ]'}而不是'conda- forge :: blas [build = openblas]':set()

这是获得结果和预期结果的可复制示例。

dependencies = ['conda',
 'python=3.7',
 'xlrd',
 'numba=0.48',
 'conda-forge::blas[build=openblas]',
 'statsmodels=0.11']

packages_list = map(lambda x: x.split("=", 1), dependencies)
package_dict = {package[0]: set(package[1:]) for package in packages_list}

print(package_dict)

# {'conda': set(),
#  'python': {'3.7'},
#  'xlrd': set(),
#  'numba': {'0.48'},
#  'conda-forge::blas[build': {'openblas]'},
#  'statsmodels': {'0.11'}}

expected_result = {'conda': set(),
 'python': {'3.7'},
 'xlrd': set(),
 'numba': {'0.48'},
 'conda-forge::blas[build=openblas]': set(),
 'statsmodels': {'0.11'}}

任何帮助将不胜感激,因为我真的不太喜欢正则表达式:-(。 非常感谢。

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 00:12:18 350 0
1 条回答
写回答
取消 提交回答
  • 由于我没有答案,因此我提出了这种解决方案,虽然它不是更优雅,但它确实有效。

    package_dict = dict()
    for split in map(lambda x: x.split("=", 1), dependencies):
        # default values
        package = split[0]
        version = set()
        # cheking if it's a proper version by testing if the first char is a digit
        if len(split) > 1:
            if split[1][0].isdigit():
                # package + version
                version = set(split[1:])
            else:
                # The split was incorrect and the package shall not be splitted
                package = f"{split[0]}={split[1]}"
        package_dict[package] = version
    

    回答来源:stackoverflow

    2020-03-24 00:12:25
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
神龙云服务器产品及技术深度解析 立即下载
弹性创造价值:基于ECS的最佳性价比实践解析 立即下载
又快又稳:阿里云下一代虚拟交换机解析 立即下载

相关镜像