Python正则如何匹配括号前文本 按时间戳拆分对话块
正则拆分带时间区间标记对话块方案
原有规则问题
你之前写的正则\(\d*-\d*\)\s*\w*:\s*仅覆盖了「时间区间+说话人前缀」部分,没有定义后续对话内容的匹配规则,也没有设置“匹配到下一个时间区间即终止”的边界逻辑,因此无法捕获完整对话块。
可用正则规则
直接提取完整对话块
使用以下正则可以直接匹配得到每个以时间区间开头、截止到下一个时间区间前的独立对话块:
\(\d+-\d+\)[\s\S]*?(?=\(\d+-\d+\)|$)
规则各部分逻辑:
\(\d+-\d+\):锚定块开头的(数字-数字)格式时间区间,将原规则的*替换为+可避免匹配空括号的异常场景[\s\S]*?:非贪婪模式匹配任意字符(包含换行、特殊符号),对应时间前缀后的所有对话内容,非贪婪配置保证匹配不会跨块(?=\(\d+-\d+\)|$):零宽正向断言,当匹配到下一个时间区间开头、或者文本末尾时立即终止当前块的匹配,不会吞掉下一个对话块的时间标记
拆分字段版正则
如果需要把每个对话块拆成「时间区间、说话人、对话内容」三个独立字段,可以使用带捕获组的版本:
(\(\d+-\d+\))\s*(\w+):\s*([\s\S]*?)(?=\(\d+-\d+\)|$)
三个捕获组依次对应:
- 时间区间标记
- 说话人标识(比如Agent、User)
- 具体对话内容
使用注意事项
- 上述正则里的
[\s\S]写法天然支持匹配换行符,不需要额外开启单行(dotAll)匹配模式,适配绝大多数编程语言的正则引擎 - 不要把非贪婪匹配符
*?改成贪婪匹配*,否则会从第一个时间标记直接匹配到整个文本末尾,导致拆分失效 - 如果你的时间区间里包含小数、毫秒等非纯整数内容,把规则里的
\d+替换成对应匹配规则即可,比如匹配带小数的时间可以改成[\d.]+
匹配效果示例
针对测试文本:
(1-4) Agent: 您好,请问有什么可以帮您? (5-12) User: 我上周买的耳机现在连不上蓝牙了 (13-25) Agent: 您可以先长按电源键10秒重置后再尝试配对
匹配后会得到3个独立对话块,完全符合“块以时间区间括号开头,内容截止到下一个时间区间之前”的要求。
内容的提问来源于stack exchange,提问作者mmustafaicer
相关产品推荐
相关产品推荐

