анализ требований к версии зависимости при разборе в python - PullRequest
0 голосов
/ 15 сентября 2018

Существует ли более эффективный способ разбора спецификации требования к версии зависимости, на которую есть ссылка, и извлечения версии в python. (https://maven.apache.org/pom.html#Dependency_Version_Requirement_Specification)

Это то, что я получил до сих пор, и это не самый эффективный способ. и я думаю, это глючит.

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 Ответ

0 голосов
/ 15 сентября 2018
(?P<eq>^[\d.]+$)|(?:^\[(?P<heq>[\d.]+)\]$)|(?:(?P<or>(?<=\]|\)),(?=\[|\())|,|(?:(?<=,)(?:(?P<lte>[\d.]+)\]|(?P<lt>[\d.]+)\)))|(?:(?:\[(?P<gte>[\d.]+)|\((?P<gt>[\d.]+))(?=,)))+

Regex перейдет к версии соответствия в следующем порядке:

  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 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...