问题描述
有没有更有效的方法来解析此处引用的依赖版本要求规范并在python中提取版本。 ( )
这是我到目前为止所掌握的,并且感觉不是最有效的方法。 我猜这是越野车。
for version in versions:
pattern = re.findall("\(,[.0-9]+|[.0-9]+\)|[.0-9]+|\([.0-9]+", version)
if pattern:
for matches in pattern:
if ([match for match in re.findall("[.0-9]+\)", matches)]):
# this is the less pattern
pattern_version = "<" + str(matches.decode('utf8')[:-1])
elif ([match for match in re.findall("\(,[.0-9]+", matches)]):
pattern_version = ">" + str(matches.decode('utf8')[2:])
elif ([match for match in re.findall("\([.0-9]+", matches)]):
pattern_version = ">" + str(matches.decode('utf8')[1:])
else:
pattern_version = str(matches.decode('utf8'))
预期输出为:
(,1.0],[1.2,)解析为:x <= 1.0或x> = 1.2
1楼
(?P<eq>^[\d.]+$)|(?:^\[(?P<heq>[\d.]+)\]$)|(?:(?P<or>(?<=\]|\)),(?=\[|\())|,|(?:(?<=,)(?:(?P<lte>[\d.]+)\]|(?P<lt>[\d.]+)\)))|(?:(?:\[(?P<gte>[\d.]+)|\((?P<gt>[\d.]+))(?=,)))+
正则表达式将按以下顺序进行版本匹配:
-
首先尝试使用以下方法匹配“软”要求:
(?P<eq>^[\\d.]+$)
-
然后尝试使用以下方法满足“硬”要求:
(?:^\\[(?P<heq>[\\d.]+)\\]$)
-
否则,请尝试按以下顺序匹配范围:
-
首先使用以下命令确定这是否是多集:
(?:(?P<or>(?<=\\]|\\)),(?=\\[|\\())
仅匹配逗号分隔集。 -
然后尝试使用以下命令匹配同一集合内的逗号分隔范围:
,
。 -
然后继续以匹配实际范围:
-
开始使用匹配上限值
(?:(?<=,)(?:(?P<lte>[\\d.]+)\\]|(?P<lt>[\\d.]+)\\)))
-
然后使用
(?:(?:\\[(?P<gte>[\\d.]+)|\\((?P<gt>[\\d.]+))(?=,))
-
开始使用匹配上限值
-
首先使用以下命令确定这是否是多集:
规范中包含的版本的结果将是:
| version | eq | heq | gte | gt | or | lte | lt |
| ------------- | --- | --- | --- | --- | -- | --- | --- |
| 1.0 | 1.0 | | | | | | |
| [1.0] | | 1.0 | | | | | |
| (,1.0] | | | | | | 1.0 | |
| [1.2,1.3] | | | 1.2 | | | 1.3 | |
| [1.0,2.0) | | | 1.0 | | | | 2.0 |
| [1.5,) | | | 1.5 | | | | |
| (,1.0],[1.2,) | | | 1.2 | | , | 1.0 | |
| (,1.1),(1.1,) | | | | 1.1 | , | | 1.1 |