如何按'['和']'分割字符串并保留括号内内容?
分割带方括号标记的歌词并保留标记内容的Python解决方案
嘿,我来帮你搞定这个需求!你要处理的是带[Chorus: ...]这类标记的歌词字符串,既要把对应的歌词段落分割出来,又想保留那些括号里的标记内容对吧?用Python的正则表达式比单纯用split()要靠谱得多,直接看代码和解释:
完整实现代码
import re # 你的原始歌词字符串(注意这里把&替换回了&,如果实际处理的是转义后的字符串可以保留) x = "[Chorus: Rihanna & Swizz Beatz] I just wanted you to know ...more lyrics [Verse 2: Kanye West & Swizz Beatz] I be Puerto Rican day parade floatin' ... more lyrics" # 用正则表达式匹配每一组「标记+歌词」 pattern = r'\[([^\]]+)\]\s*(.*?)(?=\[|$)' matched_pairs = re.findall(pattern, x) # 分离标记和歌词段落 section_labels = [pair[0] for pair in matched_pairs] split_lyrics = [pair[1] for pair in matched_pairs] # 输出结果 print("保留的括号内标记:", section_labels) print("分割后的歌词段落:", split_lyrics)
代码解释
正则表达式
r'\[([^\]]+)\]\s*(.*?)(?=\[|$)'的含义:\[([^\]]+)\]:精准匹配方括号,同时捕获括号里的所有内容(比如Chorus: Rihanna & Swizz Beatz),[^\]]+表示匹配任意非]的字符,确保只捕获括号内的部分。\s*:匹配括号后面的任意空白字符(空格、换行都算),避免歌词开头带多余空格。(.*?):用非贪婪模式捕获后续的歌词内容,直到遇到下一个[或者字符串结尾。(?=\[|$):正向预查,确保歌词内容截止到下一个标记的开头或者字符串末尾,不会把下一个标记的内容也包含进来。
运行结果:
你会得到:保留的括号内标记: ['Chorus: Rihanna & Swizz Beatz', 'Verse 2: Kanye West & Swizz Beatz'] 分割后的歌词段落: ['I just wanted you to know ...more lyrics', 'I be Puerto Rican day parade floatin\' ... more lyrics']其中
split_lyrics就是你期望得到的分割结果。
为什么不用split()?
单纯用split('[')或者split(']')只能把字符串切成零散的片段,没法同时把标记和对应的歌词对应起来,还要额外处理很多冗余内容,正则的findall()可以一次性完成匹配和分组,效率和可读性都更高。
内容的提问来源于stack exchange,提问作者izzyp
相关产品推荐
相关产品推荐

