当前位置: 代码迷 >> python >> 在python中解析依赖版本要求
  详细解决方案

在python中解析依赖版本要求

热度:72   发布时间:2023-06-19 09:23:37.0

有没有更有效的方法来解析此处引用的依赖版本要求规范并在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

(?P<eq>^[\d.]+$)|(?:^\[(?P<heq>[\d.]+)\]$)|(?:(?P<or>(?<=\]|\)),(?=\[|\())|,|(?:(?<=,)(?:(?P<lte>[\d.]+)\]|(?P<lt>[\d.]+)\)))|(?:(?:\[(?P<gte>[\d.]+)|\((?P<gt>[\d.]+))(?=,)))+

正则表达式将按以下顺序进行版本匹配:

  1. 首先尝试使用以下方法匹配“软”要求:
    (?P<eq>^[\\d.]+$)
  2. 然后尝试使用以下方法满足“硬”要求:
    (?:^\\[(?P<heq>[\\d.]+)\\]$)
  3. 否则,请尝试按以下顺序匹配范围:
    1. 首先使用以下命令确定这是否是多集:
      (?:(?P<or>(?<=\\]|\\)),(?=\\[|\\())
      仅匹配逗号分隔集。
    2. 然后尝试使用以下命令匹配同一集合内的逗号分隔范围:
      ,
    3. 然后继续以匹配实际范围:
      1. 开始使用匹配上限值
        (?:(?<=,)(?:(?P<lte>[\\d.]+)\\]|(?P<lt>[\\d.]+)\\)))
      2. 然后使用
        (?:(?:\\[(?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 |