如何使用正则表达式在文本大写字母前添加换行符
问题解决方法
核心问题是直接提取容器文本时,HTML里的块级标签、换行标签产生的换行被自动忽略,导致所有歌词挤在同一行。优先推荐从DOM解析层面解决,准确率远高于正则匹配。
方案1:DOM节点遍历提取(推荐,100%准确率)
不要直接使用.text属性提取内容,遍历歌词容器的所有子节点,遇到换行标签、块级标签时主动插入换行符,即可拿到和网页展示完全一致的带换行歌词。
如果你使用BeautifulSoup作为解析库,参考代码如下:
from bs4 import BeautifulSoup, Tag, NavigableString def extract_lyrics(lyrics_container): content = "" for node in lyrics_container.descendants: # 普通文本节点直接拼接 if isinstance(node, NavigableString): content += node.strip() # 遇到<br>、<div>、<p>这类会产生换行的标签,插入换行符 elif isinstance(node, Tag) and node.name in ("br", "div", "p"): content += "\n" return content.strip() # 传入你定位到的歌词容器标签即可 lyrics = extract_lyrics(text_container)
方案2:正则替换处理已拼接的单行文本
如果你已经拿到了挤成单行的文本,可调整正则规则,在需要的位置插入换行符,注意需要单独处理[Verse 1]、[Chorus]这类段落标签后的换行:
import re raw_text = text_container.text # 第一步:在段落标签闭合括号后插入换行 processed_text = re.sub(r"\]([A-Z])", r"]\n\n\1", raw_text) # 第二步:在句首大写单词前插入换行(替换原规则里的空格为换行符) processed_text = re.sub(r"([a-z?!.\"'])([A-Z])", r"\1\n\2", processed_text)
拿你提供的文本片段测试,处理后效果如下:
[Verse 1] Leaves are fallin' down on the beautiful ground I heard a story from the man in red He said, "The leaves are fallin' down
注意:正则方案存在极小概率误判,比如遇到
McDonald、iPhone这类内部带大写字母的单词,或者行尾为大写字母的情况时可能出现错误换行,仅适合临时快速使用。
内容的提问来源于stack exchange,提问作者Fatbob
相关产品推荐
相关产品推荐

