我想解析一个规范列表(由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
由于我没有答案,因此我提出了这种解决方案,虽然它不是更优雅,但它确实有效。
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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。