使用正则表达式在python中转换统一版本

时间:2018-11-13 22:12:36

标签: python regex

我正在尝试将统一版本格式转换为python中的以下版本

示例:

  • <2.2.1 || >=4.0.0 < 4.1.9
    应该是
    <2.2.1 || (>=4.0.0 && <4.1.9)

  • >=7.0.23 <7.0.91 || >=8.5.0 <8.5.34 || >=9.0.0 <9.0.12
    应该是
    (>=7.0.23 && <7.0.91) || (>=8.5.0 && <8.5.34) || (>=9.0.0 && <9.0.12)

  • <2.7.9.4 || >=2.8.0 <2.8.11.2 || >=2.9.0 <2.9.6
    应该是
    (>=0 && <2.7.9.4) || (>=2.8.0 && <2.8.11.2) || (>=2.9.0 && <2.9.6)

尝试了以下操作,但工作很混乱:

def rchop(thestring, ending):
  if thestring.endswith(ending):
    return thestring[:-len(ending)]
return thestring

ver = "<2.7.9.4 || >=2.8.0 <2.8.11.2 || >=2.9.0 <2.9.6"
split_ver = ver.split('||')
list_data = []
for version in split_ver:
   version = version.rstrip()
   version = version.lstrip()
   vv = version.replace(" ", " && ")
   list_data.append(vv)
print(list_data)

new_list = []
for data in list_data:
 if "&&" not in data and "=0" not in data and ">=" not in data:
   new_data = "(>=0 && " + data + ")"
   new_list.append(new_data)
 else:
   new_data1 = new_list.append("("+data+")")

final_list = []
for items in new_list:
  data = final_list.append(items + " || ")

now_data = [''.join(final_list[:])]
data1 = rchop(now_data[0], ' || ')
print(data1)

1 个答案:

答案 0 :(得分:1)

不确定是否为此需要正则表达式。似乎您可以将字符串分开几次,重新格式化各个部分,然后将它们重新组合在一起以匹配示例输出(假设您显示<2.2.1 || (>=4.0.0 && <4.1.9)的示例输出是错字,并且实际上应该遵循模式其他类似示例中的(>=0 && <2.2.1) || (>=4.0.0 && <4.1.9)

也许还有更多不遵循示例模式的极端情况,但是下面的内容至少应该为您提供一个更简单的起点。

def version_formatter(text):
    raw = [t.strip().split() for t in text.split('||')]
    formatted = [f'({r[0]} && {r[1]})' if len(r) == 2 else f'(>=0 && {r[0]})' for r in raw]
    return ' || '.join(formatted)

tests = ['<2.2.1 || >=4.0.0 <4.1.9', '>=7.0.23 <7.0.91 || >=8.5.0 <8.5.34 || >=9.0.0 <9.0.12', '<2.7.9.4 || >=2.8.0 <2.8.11.2 || >=2.9.0 <2.9.6']

for test in tests:
    result = version_formatter(test)
    print(result)

# OUTPUT
# (>=0 && <2.2.1) || (>=4.0.0 && <4.1.9)
# (>=7.0.23 && <7.0.91) || (>=8.5.0 && <8.5.34) || (>=9.0.0 && <9.0.12)
# (>=0 && <2.7.9.4) || (>=2.8.0 && <2.8.11.2) || (>=2.9.0 && <2.9.6)