从长字符串中提取歌曲名称

Extract song names from a long string

我正在做一个小项目,应该从 YouTube 视频中提取歌曲和艺术家的名字。 目前我有具有以下结构的视频描述

Text text text

Tracklist:
[00:00] Sobs - Girl
[02:25] Mopac - Cross-Eyed Dreaming
[05:54] L I P S - In Summer
[09:18] Small Wood House - T.V

Text text text

我希望能够从此字符串中提取艺术家姓名和歌曲名称。我正在尝试使用正则表达式来执行此操作,我现在拥有的正则表达式匹配时间码和换行符之前的任何文本。

'((.*([0-9]?[0-9]:)?[0-5][0-9]:[0-5][0-9]).*\n)+'

现在我需要找到一种方法来匹配时间码之前的任何文本,但不将它们包含在最终字符串中,并且还要为时间码执行此操作。我尝试使用捕获组,但没有成功。

我想要的结果应该是这样的

Sobs - Girl
Mopac - Cross-Eyed Dreaming
L I P S - In Summer
Small Wood House - T.V

这里是我要使用的正则表达式:

((\[\d+:\d+\])\s+(.*)\s+-\s+(.*))

这是例子 https://regex101.com/r/6b44UY/1

这捕获了所有内容并组成了三个不同的组 - 暂时一个 - 一个给艺术家 - 标题之一

如果要注册时间“[00:00]”之前的内容 你可以这样做:

((.*)(\[\d+:\d+\])\s+(.*)\s+-\s+(.*))

在 python 中这样做:

import re

result = re.findall(r'((\[\d+:\d+\])\s+(.*)\s+-\s+(.*))', my_text)

尝试正则表达式,在遇到方括号内的时间标记后捕获所需的组。:

text = '''Tracklist:
[00:00] Sobs - Girl
[02:25] Mopac - Cross-Eyed Dreaming
[05:54] L I P S - In Summer
[09:18] Small Wood House - T.V'''

import re
re.findall('\[\d{2}:\d{2}\]\s*(.*)', text)

输出:

['Sobs - Girl',
 'Mopac - Cross-Eyed Dreaming',
 'L I P S - In Summer',
 'Small Wood House - T.V']

您可以将时间部分与您尝试过的模式中的部分相匹配,并在捕获组中捕获它之后的内容。

\[[0-5][0-9]:[0-5][0-9]]\s*(.+?\s+-\s+.+)

模式匹配:

  • \[[0-5][0-9]:[0-5][0-9]] 在方括号之间从 00 - 59 匹配 2 次
  • \s* 匹配可选的空白字符
  • (.+?\s+-\s+.+) 捕获第 1 组,匹配该行的其余部分,并确保它包含 -

Regex demo

示例代码

import re
 
pattern = r"\[[0-5][0-9]:[0-5][0-9]]\s*(.+?\s+-\s+.+)"
 
s = ("Text text text\n\n"
    "Tracklist:\n"
    "[00:00] Sobs - Girl\n"
    "[02:25] Mopac - Cross-Eyed Dreaming\n"
    "[05:54] L I P S - In Summer\n"
    "[09:18] Small Wood House - T.V\n\n"
    "Text text text")

输出

[
'Sobs - Girl',
'Mopac - Cross-Eyed Dreaming',
'L I P S - In Summer',
'Small Wood House - T.V'
]

或者您可以在捕获组中捕获 - 前后的内容,以分别匹配名称和歌曲。

\[[0-5][0-9]:[0-5][0-9]]\s*(.+?)\s+-\s+(.+)

Regex demo