Python 如何更好地解析随机轨迹列表

Python 如何更好地解析随机轨迹列表,python,regex,parsing,text-parsing,pyparsing,Python,Regex,Parsing,Text Parsing,Pyparsing,我对解析各种格式的轨迹列表感兴趣,其中包含以下行: artist - title artist-title artist / title artist - "title" 1. artist - title 0:00 - artist - tit le 05 artist - title 12:20 artist - title [record label] 这些文本文件通常包含一个tracklist,但也可能包含我不想解析的其他内容,因此理想情况下,正则表达式需要足够严格,不包含非tr

我对解析各种格式的轨迹列表感兴趣,其中包含以下行:

artist - title
artist-title
artist / title
artist - "title"
1. artist - title
0:00 - artist - tit le
05 artist - title    12:20
artist - title [record label]
这些文本文件通常包含一个tracklist,但也可能包含我不想解析的其他内容,因此理想情况下,正则表达式需要足够严格,不包含非tracklist的行,尽管这实际上可能是一个平衡问题

我在以下正则表达式方面取得了一些成功:

simple = re.compile(r"""
^
(?P<time>\d?\d:\d\d)? # track time in 00:00 or 0:00
(
(?P<number>\d{1,2})   # track number as 0 01
[^\w]                 # not followed by word
)?
[-.)]?                # possibly followed by something
"?
(?P<artist>[^"@#]+)   # artist anything except "@#
"?
\s[-/\u2013]\s
"?                    # dash surrounded by spaces, possibly unicode
(?P<title>[^"@#]+?)   # title, not greedy
"?
(?P<label>\[\w+\])?   # label i.e. [something Records]
(//|&\#13;)?          # remove some weird endings, i.e. ascii carriage return
$
""", re.VERBOSE)
在2 Croozin'-2 Pumpin'的情况下,判断2不是音轨编号的唯一方法是考虑周围环境,即查看其他音轨。(我忘了提到这一点-这些曲目通常是曲目列表的一部分)

所以我的问题是,我怎样才能在总体上改善这一点?我的一些想法是:

  • 使用几个正则表达式,从非常具体的正则表达式开始,继续使用不太具体的正则表达式,直到它被正确解析
  • 转储regex并使用适当的解析器,例如pyparsing或parsley,这可能能够更好地利用周围的上下文,但是我对解析一无所知
  • 在多行正则表达式中使用lookahead/lookahead查看上一行/下一行
  • 使用单独的正则表达式获取时间、曲目编号、艺术家、标题
  • 放弃,做一些没有意义的事

我可以验证它是否已正确解析(在某种程度上)做了一些事情,例如确保艺术家和标题都不同,曲目有序,时间合理,甚至可能检查艺术家/标题/标签是否确实存在

充其量,您正在处理一个将您从regexps可以单独处理的领域转移到解析的问题

即使您的解析器被实现为一个regexp和一堆启发式算法,它仍然是一个解析器,来自解析的技术将是有价值的。有些语言有一个鸡蛋问题:我想把“以前被称为艺术家,以前被称为王子”的艺术家称为艺术家,而不是音轨标题,但在我第二次看到它之前,我没有上下文来做出决定

为了放大@JonClements注释,如果文件确实包含内部元数据,那么有很多工具可以提取和处理这些信息。即使内部元数据只是增加了“平衡问题”成为专辑标题的可能性,您也需要这些信息


尽可能多地窃取设计方法:寻找开源标记操纵器(例如EasyTag),看看它们是如何做到的。当你在学习的时候,你可能会找到一个能帮你完成工作的工具

充其量,您正在处理一个将您从regexps可以单独处理的领域转移到解析的问题

即使您的解析器被实现为一个regexp和一堆启发式算法,它仍然是一个解析器,来自解析的技术将是有价值的。有些语言有一个鸡蛋问题:我想把“以前被称为艺术家,以前被称为王子”的艺术家称为艺术家,而不是音轨标题,但在我第二次看到它之前,我没有上下文来做出决定

为了放大@JonClements注释,如果文件确实包含内部元数据,那么有很多工具可以提取和处理这些信息。即使内部元数据只是增加了“平衡问题”成为专辑标题的可能性,您也需要这些信息


尽可能多地窃取设计方法:寻找开源标记操纵器(例如EasyTag),看看它们是如何做到的。当你在学习的时候,你可能会找到一个能帮你完成工作的工具

你不会碰巧有一堆MP3或类似的文件,上面有适当的元数据,是吗?或者,你真的在试图处理一个文本文件和一系列行或其他东西……由于你的语法中固有的歧义,你必须尝试解析许多不同的方式,并检查每种方式是否“有意义”(你提到你能够在某种程度上进行验证)。然后你可以选择第一种有意义的解析,或者,您可以根据语法分析的常见程度为语法分析分配权重,并选择“最佳”语法分析。我认为把所有东西塞进一个正则表达式是行不通的。您必须使用某种标记,然后进行解析。(尽管你可以使用正则表达式进行标记化,如果你愿意。)@JonClements:谢谢你的提问,我意识到我没有给出足够的上下文,所以已经更新了question@kqr:你对语法分析了解多少,你能提供一些资源让我开始解决这个问题吗?你没有一堆MP3或类似的,上面有适当的元数据,是吗?或者,你真的在试图处理一个文本文件和一系列行或其他东西……由于你的语法中固有的歧义,你必须尝试解析许多不同的方式,并检查每种方式是否“有意义”(你提到你能够在某种程度上进行验证)。然后你可以选择第一种有意义的解析,或者,您可以根据语法分析的常见程度为语法分析分配权重,并选择“最佳”语法分析。我认为把所有东西塞进一个正则表达式是行不通的。您必须使用某种标记,然后进行解析。(尽管你可以使用正则表达式进行标记化,如果你愿意。)@JonClements:谢谢你的提问,我意识到我没有给出足够的上下文,所以已经更新了question@kqr:你对语法分析了解多少,你能提供一些资源让我开始解决这个问题吗?因为你花了时间把这个问题作为一个答案,我会补充一个潜在的信息来源,可以利用(艺术家/专辑/曲目名称)is:由于您已经花了时间将此作为一个答案,我将补充一点,可以利用的潜在信息来源(艺术家/专辑/曲目名称)是:
an artist-a title           # couldn't find ' - '
2 Croozin' - 2 Pumpin'      # mistakes 2 as track number
05 artist - title  12:20    # doesn't work at all