正则表达式如何匹配数字换行至双换行\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
相关产品推荐
相关产品推荐

