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

正则表达式如何匹配数字换行至双换行\n\n之间的文本片段

匹配失败核心原因

之前尝试的正则写法存在两个明显问题:

  • 定位起点错误:(?<=\d\n)锚定的是字幕序号后的换行位置,但序号和正文之间还夹着说话人标识、时间码行,这部分内容没有被跳过,自然匹配不到正文开头。
  • 匹配规则限制:默认正则语法中.不会匹配换行符,写.*?时遇到单换行就会终止匹配,无法抓取内部自带换行的字幕内容。
可用正则方案

开启跨行匹配模式(让.可以匹配换行符)后,使用如下正则即可:

(?:\d+\n.*?\n)(.*?)(?=\n\n|$)
  • 规则说明:
    • (?:\d+\n.*?\n):非捕获组,匹配并跳过字幕块开头的序号行、时间码行,定位到正文起始位置
    • (.*?):非贪婪模式捕获正文内容
    • (?=\n\n|$):正向断言,匹配到双换行(字幕块分隔符)或者字符串末尾时停止匹配,兼容最后一条字幕没有尾部双换行的场景
不同语言的实现代码

Python(re库)

传入re.S(别名re.DOTALL)标记开启跨行匹配:

import re

raw_str = "1 Matt\n00:00:00,100 --> 00:00:01,500\nThis is said \nby Matt.\n\n2 Lucas\n00:00:01,700 --> 00:00:02,300\nWhile this is said by Lucas"
reg = r"(?:\d+\n.*?\n)(.*?)(?=\n\n|$)"
result = re.findall(reg, raw_str, re.S)
print(result)
# 输出结果: ['This is said \nby Matt.', 'While this is said by Lucas']

R(stringr库)

在regex()中设置dotall = TRUE开启跨行匹配:

library(stringr)

raw_str <- "1 Matt\n00:00:00,100 --> 00:00:01,500\nThis is said \nby Matt.\n\n2 Lucas\n00:00:01,700 --> 00:00:02,300\nWhile this is said by Lucas"
reg <- "(?:\\d+\\n.*?\\n)(.*?)(?=\\n\\n|$)"
match_res <- str_match_all(raw_str, regex(reg, dotall = TRUE))[[1]][,2]
print(match_res)
# 输出结果: [1] "This is said \nby Matt."       "While this is said by Lucas"

内容的提问来源于stack exchange,提问作者aooo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 05:36:34