我正在尝试将统一版本格式转换为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)
答案 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)