python - 解析大型 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 行。但是,在制作全套时,匹配时间太长了。在这一点上,我不能让它完成,不得不终止它。
我无法让这个解析工作,这是设计模式问题还是正则表达式太慢?我很困惑。
解决方案
一种选择可能是重复键值对而不是使用非贪婪.+?
来防止不必要的回溯并省略积极的lookahhead (?=
:
^(#\S+(?:\s+[^\s="]+="[^"]+")+),(.*)\s*(.*)
解释
^
字符串的开始(
第一捕获组#\S+
匹配 # 后跟 0+ 次非空白字符(?: [^\s="]+="[^"]+")+
重复 1 次以上的键值对,前面是 1 次以上的空白字符
)
关闭组 1,(.*)
匹配逗号并捕获第 2 组中任何字符的 0 次以上\s*
匹配 0+ 次空格字符(.*)
在匹配任何字符 0+ 次的第 3 组中捕获
推荐阅读
- javascript - Reactjs:将道具从卡片组件传递到选项卡组件
- recursion - 检查二叉树是否为二叉搜索树的 Lisp 程序
- javascript - 如何设置 htaccess 以从用户友好的 URL 获取参数以与 JS 一起使用
- regex - 使用正则表达式从字符串返回第 n 个匹配项
- php - 多对多获取相关项目
- google-sheets - 基于 18 个月前的日期的条件格式
- firebase - Firebase Environmental Config - Added slashes to private_key_id
- javascript - 如何使用 React Ref 调用 video.play()?
- android - 颤振重新定位键盘向下
- javascript - 标题出现在滚动条上?