如何使用正则表达式过滤角色名及标记,提取转录文本的纯内容
两类文本提取需求的正则实现方案
两类需求都可以通过正则表达式实现,具体操作如下:
第一类:剧场转录文本台词提取
你当前编写的正则无法完全适配需求,存在三个明显问题:
- 字符匹配范围有限,仅覆盖了英文字母和äüö,未考虑角色名可能存在的其他合法字符
- 完全未适配可选的括号包裹的动作标注部分
- 未处理冒号后的空白字符,提取结果容易残留多余空格
实现方案
推荐使用前缀替换法,匹配行首所有角色+动作+冒号的前缀部分,直接替换为空即可得到纯台词。
适用正则:^\*\*[^*]+\*\*(?:\s*\([^)]+\))?:\s*
规则说明:
^匹配行首位置\*\*[^*]+\*\*匹配包裹在两个星号内的角色名(?:\s*\([^)]+\))?非捕获组,匹配可选的动作标注部分(支持动作前后的任意空格,括号内内容任意),?表示该组可出现0次或1次:\s*匹配冒号及冒号后的任意空白字符
操作方式:开启正则多行模式,将所有匹配到的前缀替换为空字符串,即可批量得到纯台词结果。也可以调整正则为捕获分组模式 ^\*{2}[^*]+\*{2}(?:\s*\([^)]+\))?:\s*(.*)$,直接提取第一个捕获分组的内容作为台词。
第二类:带前后置标记的文本内容提取
核心逻辑是分别过滤行首的所有标记前缀、行尾的所有标记后缀,保留中间有效内容,推荐用两步替换法适配性更强。
实现方案
- 第一步过滤行首标记,正则:
^[\*\(][\s\S]*?\s,替换为空
规则:匹配行首以*或(开头的所有标记内容,直到第一个有效内容前的空格为止 - 第二步过滤行尾标记,正则:
\s[\*\(][\s\S]*?$,替换为空
规则:匹配行尾前的空格开始,以*或(开头的所有标记内容,直到行尾为止
如果你的有效内容确定不会包含*或()包裹的独立标记,也可以用单步捕获的方式,正则:^\W*?(.*?)\s*(?:\*[^*]+\*|\([^)]+\))*\s*$,直接提取第一个捕获分组的内容即可。
内容的提问来源于stack exchange,提问作者CoderGer
相关产品推荐
相关产品推荐

