gpt4 book ai didi

Python Regex 查找连字符后非数字范围的匹配组,如果范围不存在则忽略模式的其余部分

转载 作者:太空宇宙 更新时间:2023-11-04 08:33:48 24 4
gpt4 key购买 nike

我对更高级的正则表达式概念比较陌生,开始研究后视和前视,但我感到困惑,需要一些指导。我有一个场景,我可能有几种不同类型的发布 zip,名称如下:

v1.1.2-beta.2.zip
v1.1.2.zip

我想写一个单行正则表达式,可以在两种类型中找到匹配组。例如,如果文件类型是第一个 zip,我想要三个匹配组,如下所示:

v1.1.2-beta.2.zip
Group 1: v1.1.2
Group 2: beta
Group 3. 2

或者如果第二个 zip one 匹配组:

v1.1.2.zip
Group 1: v1.1.2

这就是事情开始让我感到困惑的地方,因为我假设正则表达式需要断言连字符是否存在,如果不存在,则只查找一个匹配组,如果找不到其他 3 个匹配组。

(v[0-9.]{0,}).([A-Za-z]{0,}).([0-9]).zip

这是我写的第一个正则表达式成功匹配第一个类型但没有条件。我正在考虑做一些事情,比如匹配连字符后的非数字组范围,但不能完全让它工作,也不知道让它忽略模式的其余部分,如果不接受,只接受第一组找到连字符

([\D]{0,}(?=[-]) # Does not work

有人能给我指出正确的方向吗?

最佳答案

你可以使用re.findall:

import re
s = ['v1.1.2-beta.2.zip', 'v1.1.2.zip']
final_results = [re.findall('[a-zA-Z]{1}[\d\.]+|(?<=\-)[a-zA-Z]+|\d+(?=\.zip)', i) for i in s]
groupings = ["{}\n{}".format(a, '\n'.join(f'Group {i}: {c}' for i, c in enumerate(b, 1))) for a, b in zip(s, final_results)]
for i in groupings:
print(i)
print('-'*10)

输出:

v1.1.2-beta.2.zip
Group 1: v1.1.2
Group 2: beta
Group 3: 2
----------
v1.1.2.zip
Group 1: v1.1.2.
----------

请注意,从 re.findall 获得的结果是:

[['v1.1.2', 'beta', '2'], ['v1.1.2.']]

关于Python Regex 查找连字符后非数字范围的匹配组,如果范围不存在则忽略模式的其余部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50775629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com