首页 > 解决方案 > 解析大型 M3U 文件时遇到问题

问题描述

M3U 文件是一个播放列表文件,它包含描述媒体文件的条目列表、它们的名称、ID、类别等。第一行是元数据,第二行是文件或流 URL。

示例:

#EXTINF:-1 tvg-id="ChannelName" tvg-name="|FR| Channel" tvg-logo="http://logo" timeshift="1" group-title="|FR| FrenchChannel",|FR| Channel Fullname
URL

我的文件包含大约 90,000 个条目和 160,000 行。重量约为 20Mb。

我想解析这个文件,并获取每个条目。我尝试使用这个正则表达式:

'(.+?),(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)(.+)\s*(.+)\s*'

它为我提供了不同匹配组中的元数据、全名和 URL。它适用于不同的子集,包括 30,000 和 50,000 行。但是,在制作全套时,匹配时间太长了。在这一点上,我不能让它完成,不得不终止它。

我无法让这个解析工作,这是设计模式问题还是正则表达式太慢?我很困惑。

标签: pythonregexm3u

解决方案


一种选择可能是重复键值对而不是使用非贪婪.+?来防止不必要的回溯并省略积极的lookahhead (?=

^(#\S+(?:\s+[^\s="]+="[^"]+")+),(.*)\s*(.*)

解释

  • ^字符串的开始
  • (第一捕获组
    • #\S+匹配 # 后跟 0+ 次非空白字符
    • (?: [^\s="]+="[^"]+")+重复 1 次以上的键值对,前面是 1 次以上的空白字符
  • )关闭组 1
  • ,(.*)匹配逗号并捕获第 2 组中任何字符的 0 次以上
  • \s*匹配 0+ 次空格字符
  • (.*)在匹配任何字符 0+ 次的第 3 组中捕获

正则表达式演示


推荐阅读