我是新手,正在尝试提取歌词中的段落标题、伴唱和主唱部分。以下是一些歌词的示例:
诗歌标题包括方括号及其之间的任何单词。它们可以通过使用html标签中的"``````"成功地隔离出来。
和诗歌标题类似,合唱部分的歌词被放置在括号内。使用以下方法可以成功地将其隔离出来:
[Intro]
D.A. got that dope!
[Chorus: Travis Scott]
Ice water, turned Atlantic (Freeze)
Nightcrawlin' in the Phantom (Skrrt, Skrrt)...
诗歌标题包括方括号及其之间的任何单词。它们可以通过使用html标签中的"``````"成功地隔离出来。
r'\[{1}.*?\]{1}'
和诗歌标题类似,合唱部分的歌词被放置在括号内。使用以下方法可以成功地将其隔离出来:
r'\({1}.*?\){1}'
对于主唱部分,我使用了
r'\S+'
该方法可以隔离主音轨,但也会同时隔离副歌标题和伴唱部分。我无法通过简单的正则表达式仅隔离主音轨。
这是一个Python脚本,可以得到我想要的输出结果,但我想通过正则表达式来完成(作为学习练习),但我不能从文档中找到解决方法。
import re
file = 'D:/lyrics.txt'
with open(file, 'r') as f:
lyrics = f.read()
def find_spans(pattern, string):
pattern = re.compile(pattern)
return [match.span() for match in pattern.finditer(string)]
verses = find_spans(r'\[{1}.*?\]{1}', lyrics)
backing_vocals = find_spans(r'\({1}.*?\){1}', lyrics)
main_vocals = find_spans(r'\S+', lyrics)
exclude = verses
exclude.extend(backing_vocals)
not_main_vocals = []
for span in exclude:
start, stop = span
not_main_vocals.extend(list(range(start, stop)))
main_vocals_temp = []
for span in main_vocals:
append = True
start, stop = span
for i in range(start, stop):
if i in not_main_vocals:
append = False
continue
if append == True:
main_vocals_temp.append(span)
main_vocals = main_vocals_temp
x{1}
中,{1}
是无用的。x
已经寻找一个且仅一个字符。 - Kaddath