无法解析大型M3U文件

时间:2019-06-15 13:47:46

标签: python regex 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行的不同子集。但是,当处理完整集时,匹配花费的时间太长。在这一点上,我不能让它完成而不得不终止它。

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

1 个答案:

答案 0 :(得分:2)

一种选择可能是重复键值对,而不是使用非贪婪的s来防止不必要的回溯并省略正向旁白.+?

(?=

说明

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

Regex demo