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

如何用正则表达式提取LibriSpeech语料中的说话人信息

解决LibriSpeech说话人信息的正则提取问题

看起来你已经尝试用命名捕获组来提取这些字段了,但大概率是遇到了竖线两侧空白字符干扰的问题——比如原正则里的.*会把|前后的空格也包含到字段值里,导致提取出的speaker_id是"58 "而不是干净的"58",性别可能是" M "之类的。

我给你调整一个精准的正则表达式,专门适配这种带分隔空格的格式:

import re

pattern = r'(?P<speaker_id>\d+)\s*\|\s*(?P<sex>[MF])\s*\|\s*(?P<subset>\S+)\s*\|\s*(?P<minutes>\d+\.\d+)\s*\|\s*(?P<speaker_name>.+)'

正则各部分解释:

  • (?P<speaker_id>\d+): 匹配纯数字的说话人ID,避免捕获多余空格
  • \s*\|\s*: 匹配竖线及其前后任意数量的空白字符(空格、制表符都能处理)
  • (?P<sex>[MF]): 只匹配M/F单个字母,精准对应性别字段
  • (?P<subset>\S+): 匹配不含空格的语料子集名称(LibriSpeech的子集名都是无空格的)
  • (?P<minutes>\d+\.\d+): 匹配带小数点的时长数字,确保只捕获有效时长值
  • (?P<speaker_name>.+): 匹配剩余的所有内容作为姓名,支持姓名里带空格(比如示例里的George Coutts)

测试示例代码:

line = "58 | M | train-other-500 | 30.06 | George Coutts"
match = re.fullmatch(pattern, line)
if match:
    speaker_info = match.groupdict()
    print(speaker_info)

运行后输出的干净结果:

{
    'speaker_id': '58',
    'sex': 'M',
    'subset': 'train-other-500',
    'minutes': '30.06',
    'speaker_name': 'George Coutts'
}

额外优化建议:

如果需要把minutes转换成浮点数,可以直接在提取后处理:

speaker_info['minutes'] = float(speaker_info['minutes'])

如果遇到某些行可能有格式轻微变动(比如姓名末尾有空格),可以把最后一部分改成(?P<speaker_name>.+?)\s*$,用非贪婪匹配加上末尾的空白处理,确保姓名干净。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:57:17