如何用正则表达式提取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
相关产品推荐
相关产品推荐

