python - 解析大型 M3U 文件时遇到问题

标签 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 行)上都能正常工作。然而,当处理全套时,匹配时间太长。当时我无法让它完成,不得不终止它。

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

最佳答案

一种选择可能是重复键值对,而不是使用非贪婪的 .+? 以防止不必要的回溯并省略正向查找 (?=:

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

说明

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

Regex demo

关于python - 解析大型 M3U 文件时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56610938/

相关文章:

python - 查找 Pandas DataFrame 中缺失样本点的数量

grep 中的正则表达式用于包含 A、B、C...但不包含 Z 的文件

python - 如何使用正则表达式创建特定的虚拟变量?

python - 如何用 2 * 3 block 占据 10 x 10 block ,并且不让其他人推另一个 2 * 3 block

python - 沿 axis=1 对值进行排序,NaN 位于行开头

regex - 如何提取R中字符之间的数字

ios - 如何在 IOS 应用程序中下载 m3u 视频?

ios - 如何在 iOS 中下载和解密 HTTP Live Streaming (HLS) 视频?

ios - iTunes 如何解析 m3u 文件

Python将字符串转换为字典