You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用正则表达式在文本大写字母前添加换行符

问题解决方法

核心问题是直接提取容器文本时,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 15:24:26