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

为何用于解析M3U的正则表达式无法正常工作?

解析M3U文件的正则表达式方案

我来帮你搞定这个M3U文件的正则解析问题!先把你提供的M3U原始内容贴出来方便参考:

#EXTM3U 
#EXT-X-VERSION:3 
#EXT-X-MEDIA-SEQUENCE:153741 
#EXT-X-ALLOW-CACHE:NO 
#EXT-X-TARGETDURATION:11 
#EXTINF: 10.005333 , /RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-29.ts 
#EXTINF: 9.984000 , /RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-39.ts 
#EXTINF: 10.005333 , /RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-49.ts 
#EXTINF: 10.005333 , /RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-59.ts 
#EXTINF: 10.005333 , /RTS_1_009/audio/2018...

一、提取M3U头部关键信息

针对头部的配置字段,你可以用这些精准匹配的正则:

  • 提取版本号:#EXT-X-VERSION:(\d+)
    • 捕获组1会返回版本数字(比如这里的3)
  • 提取媒体序列号:#EXT-X-MEDIA-SEQUENCE:(\d+)
    • 捕获组1返回序列值(比如153741)
  • 提取缓存允许状态:#EXT-X-ALLOW-CACHE:(YES|NO)
    • 捕获组1返回YES或NO
  • 提取目标时长:#EXT-X-TARGETDURATION:(\d+)
    • 捕获组1返回目标时长数值(比如11)

二、提取媒体段(TS文件)信息

核心是匹配每一行的EXTINF条目,这里要注意时长前后的空格,正则要兼容这种格式:

#EXTINF:\s*([\d.]+)\s*,\s*(.+)
  • \s*:匹配任意数量的空格(包括0个),兼容时长和逗号前后的空格
  • ([\d.]+):捕获媒体段的时长(比如10.005333)
  • (.+):捕获TS文件的完整路径(比如/RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-29.ts)

三、示例Python解析代码

如果用Python实现,可以参考这段代码:

import re

m3u_content = """#EXTM3U 
#EXT-X-VERSION:3 
#EXT-X-MEDIA-SEQUENCE:153741 
#EXT-X-ALLOW-CACHE:NO 
#EXT-X-TARGETDURATION:11 
#EXTINF: 10.005333 , /RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-29.ts 
#EXTINF: 9.984000 , /RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-39.ts 
#EXTINF: 10.005333 , /RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-49.ts 
#EXTINF: 10.005333 , /RTS_1_009/audio/2018-03-16-H13/audio-2018-03-16-13-58-59.ts 
#EXTINF: 10.005333 , /RTS_1_009/audio/2018..."""

# 提取头部信息
version_match = re.search(r'#EXT-X-VERSION:(\d+)', m3u_content)
sequence_match = re.search(r'#EXT-X-MEDIA-SEQUENCE:(\d+)', m3u_content)
cache_match = re.search(r'#EXT-X-ALLOW-CACHE:(YES|NO)', m3u_content)
target_duration_match = re.search(r'#EXT-X-TARGETDURATION:(\d+)', m3u_content)

if version_match:
    print(f"M3U版本: {version_match.group(1)}")
if sequence_match:
    print(f"媒体序列号: {sequence_match.group(1)}")
if cache_match:
    print(f"允许缓存: {cache_match.group(1)}")
if target_duration_match:
    print(f"目标时长: {target_duration_match.group(1)}")

# 提取所有媒体段
media_segments = re.findall(r'#EXTINF:\s*([\d.]+)\s*,\s*(.+)', m3u_content)
print("\n媒体段列表:")
for duration, path in media_segments:
    print(f"时长: {duration}s,路径: {path}")

这段代码会输出所有你需要的头部配置和媒体段信息,完全适配你提供的M3U格式。如果还有特殊格式的条目需要处理,随时调整正则即可!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:39:39