从长字符串中提取歌曲名称
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 组,匹配该行的其余部分,并确保它包含 -
示例代码
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+(.+)
我正在做一个小项目,应该从 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 组,匹配该行的其余部分,并确保它包含-
示例代码
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+(.+)