为何用于解析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)
- 捕获组1会返回版本数字(比如这里的
- 提取媒体序列号:
#EXT-X-MEDIA-SEQUENCE:(\d+)- 捕获组1返回序列值(比如
153741)
- 捕获组1返回序列值(比如
- 提取缓存允许状态:
#EXT-X-ALLOW-CACHE:(YES|NO)- 捕获组1返回
YES或NO
- 捕获组1返回
- 提取目标时长:
#EXT-X-TARGETDURATION:(\d+)- 捕获组1返回目标时长数值(比如
11)
- 捕获组1返回目标时长数值(比如
二、提取媒体段(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
相关产品推荐
相关产品推荐

