使用R解析带角色名的修改版srt字幕生成data.frame
自定义带角色名SRT解析方案(R实现)
核心逻辑依托自定义SRT的固定结构特征做正则匹配,无需逐行遍历,可兼容字幕文本内部带换行、角色名带空格的场景,最终直接输出目标结构的data.frame。
实现步骤
- 统一换行符格式,兼容Windows系统生成的
\r\n换行 - 用正则一次性匹配每条字幕的完整块,分别捕获角色名、对应台词文本
- 清洗提取到的内容,组装为结构化表格
可直接运行的代码
# srt_raw 为通过readtext读入得到的带换行符的整段SRT字符串 # 统一换行符格式 srt_clean <- gsub("\r\n", "\n", srt_raw) # 正则匹配所有字幕块,正则规则说明: # 1. 匹配每条字幕开头的「序号+空格+角色名」行,捕获角色名 # 2. 跳过下一行固定格式的时间戳行(匹配HH:MM:SS,mmm --> HH:MM:SS,mmm结构) # 3. 非贪婪匹配后续的台词文本,直到遇到下一条字幕的起始标记或字符串末尾 match_result <- gregexpr( pattern = "^(\\d+)\\s+([^\\n]+)\\n\\d{2}:\\d{2}:\\d{2}[,.]\\d{3}\\s+-->\\s+\\d{2}:\\d{2}:\\d{2}[,.]\\d{3}\\n(.*?)(?=\\n*\\d+\\s+[^\\n]+\\n\\d{2}:|$)", text = srt_clean, perl = TRUE ) # 提取捕获内容 all_blocks <- regmatches(srt_clean, match_result)[[1]] # 提取角色名 character_col <- gsub("^\\d+\\s+([^\\n]+)\\n.*", "\\1", all_blocks, perl = TRUE) # 提取台词文本 text_col <- gsub("^.*?\\d{2}:\\d{2}:\\d{2}[,.]\\d{3}.*?\\n(.*)$", "\\1", all_blocks, perl = TRUE) # 文本清洗:按需选择是否保留文本内部换行 # 以下代码会把文本内部换行替换为空格,需要保留换行则注释此行 text_col <- gsub("\\s*\n\\s*", " ", text_col) # 清除首尾多余空白 text_col <- trimws(text_col) # 组装为目标data.frame srt_df <- data.frame( CHARACTER = character_col, TEXT = text_col, stringsAsFactors = FALSE )
兼容说明
- 已兼容角色名带空格的场景(如角色名
John Smith可正常提取) - 已兼容单条台词跨多行的场景
- 已兼容时间戳毫秒分隔符为逗号、点两种常见格式
- 用你给出的示例字符串运行后,输出结果完全匹配需求结构:
CHARACTER TEXT 1 Matt This is said by Matt. 2 Lucas While this is said by Lucas
内容的提问来源于stack exchange,提问作者aooo
相关产品推荐
相关产品推荐

