gpt4 book ai didi

python - 如何将正则表达式与多个重叠模式匹配?

转载 作者:行者123 更新时间:2023-11-28 18:54:06 24 4
gpt4 key购买 nike

上下文

我有一个由混合 mp3 信息组成的字符串,我必须尝试将其与由任意字符串和标记组成的模式进行匹配。它是这样工作的:

  1. 程序向用户显示给定的字符串

the Beatles_Abbey_Road-SomeWord-1969

  1. 用户输入一个模式来帮助程序解析字符串

the %Artist_%Album-SomeWord-%Year

  1. 然后我想显示比赛结果(但需要你的帮助)

2 possible matches found :
[1] {'Artist': 'Beatles', 'Album':'Abbey_Road', 'Year':1969}
[2] {'Artist': 'Beatles_Abbey', 'Album':'Road', 'Year':1969}

问题

例如,假设模式是艺术家姓名后跟标题(分隔符:“-”)。

示例 1:

>>> artist = 'Bob Marley'
>>> title = 'Concrete Jungle'
>>> re.findall(r'(.+)-(.+)', '%s-%s' % (artist,title))
[('Bob Marley', 'Concrete Jungle')]

到目前为止,还不错。但是……
我无法控制所使用的定界符,也无法保证它不存在于标签中,因此存在更棘手的情况:

示例 2:

>>> artist = 'Bob-Marley'
>>> title = 'Roots-Rock-Reggae'
>>> re.findall(r'(.+)-(.+)', '%s-%s' % (artist,title))
[('Bob-Marley-Roots-Rock', 'Reggae')]

正如预期的那样,它在那种情况下不起作用

如何生成艺术家/标题的所有可能组合?

[('Bob', 'Marley-Roots-Rock-Reggae'),
('Bob-Marley', 'Roots-Rock-Reggae')
('Bob-Marley-Roots', 'Rock-Reggae'),
('Bob-Marley-Roots-Rock', 'Reggae')]

正则表达式是用于该工作的工具吗?

请记住,要匹配的标签数量和这些标签之间的分隔符不是固定的,而是用户定义的(因此要使用的正则表达式必须是可动态构建的)。
我尝试尝试使用贪婪匹配与最小匹配先行 断言,但没有成功。

谢谢你的帮助

最佳答案

这个解决方案似乎有效。除了正则表达式之外,您还需要一个元组列表来描述模式,其中每个元素对应于正则表达式的一个捕获组。

对于您的披头士乐队示例,它看起来像这样:

pattern = r"the (.+_.+)-SomeWord-(.+)"
groups = [(("Artist", "Album"), "_"), ("Year", None)]

因为 ArtistAlbum 只被一个分隔符分开,所以它们将被一起捕获在一个组中。列表中的第一项表示第一个捕获组将拆分为 ArtistAlbum,并将使用 _ 作为分隔符.列表中的第二项表示第二个捕获组将直接用作 Year,因为元组中的第二个元素是 None。然后您可以像这样调用该函数:

>>> get_mp3_info(groups, pattern, "the Beatles_Abbey_Road-SomeWord-1969")
[{'Album': 'Abbey_Road', 'Year': '1969', 'Artist': 'Beatles'}, {'Album': 'Road', 'Year': '1969', 'Artist': 'Beatles_Abbey'}]

代码如下:

import re
from itertools import combinations

def get_mp3_info(groups, pattern, title):
match = re.match(pattern, title)
if not match:
return []
result = [{}]
for i, v in enumerate(groups):
if v[1] is None:
for r in result:
r[v[0]] = match.group(i+1)
else:
splits = match.group(i+1).split(v[1])
before = [d.copy() for d in result]
for comb in combinations(range(1, len(splits)), len(v[0])-1):
temp = [d.copy() for d in before]
comb = (None,) + comb + (None,)
for j, split in enumerate(zip(comb, comb[1:])):
for t in temp:
t[v[0][j]] = v[1].join(splits[split[0]:split[1]])

if v[0][0] in result[0]:
result.extend(temp)
else:
result = temp
return result

还有鲍勃马利的另一个例子:

>>> pprint.pprint(get_mp3_info([(("Artist", "Title"), "-")],
... r"(.+-.+)", "Bob-Marley-Roots-Rock-Reggae"))
[{'Artist': 'Bob', 'Title': 'Marley-Roots-Rock-Reggae'},
{'Artist': 'Bob-Marley', 'Title': 'Roots-Rock-Reggae'},
{'Artist': 'Bob-Marley-Roots', 'Title': 'Rock-Reggae'},
{'Artist': 'Bob-Marley-Roots-Rock', 'Title': 'Reggae'}]

关于python - 如何将正则表达式与多个重叠模式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6705206/

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