抓住一根短弦的两部分

时间:2012-07-03 21:01:14

标签: python regex id3

我希望用dictTAG对填充py definition,我正在使用RegExr http://gskinner.com/RegExr/来编写正则表达式

我的第一步是从http://www.id3.org/id3v2.3.0http://pastebin.com/VJEBGauL解析一行,并提取ID3标记和相关定义。例如第一行:

4.20    AENC    [#sec4.20 Audio encryption]

看起来像myDict = {'AENC' : 'Audio encryption'}

要获取标记名称,我已经找到了至少3个空格,然后是4个字符,然后是4个空格:{3}[a-zA-Z0-9]{4} {4}这部分很容易。

第二部分,定义,对我来说不合适。到目前为止,我有(?<=(\[#.+?)) A哪个应该找到,但不包括[#以及一组不确定的字符,直到它找到:_A,但它失败了。如果我删除.+?并将_A替换为s,则可以正常运行。出了什么问题? *下划线代表空格,不会出现在SO上。

如何使用RegEx从线路中获取ID3v2标记的(Audio encryption)定义?

编辑:感谢我从mVChr得到的答案,我为其他人尝试做同样的事情写了这个:http://pastebin.com/0nT74dpB

2 个答案:

答案 0 :(得分:3)

您应该使用捕获组()来提取您所需的内容:

import re
line = '4.20    AENC    [#sec4.20 Audio encryption]'
full_match = re.search(r'^\S+\s+(\S+)\s+\[#\S+ (.*?)\]', line)
dict_key = full_match.group(1)   # 'AENC'
id3v2_tag = full_match.group(2)  # 'Audio encryption'

答案 1 :(得分:2)

这样的东西?请注意我是如何在第一部分中使用line.split()的。

import re
line = '4.20    AENC    [#sec4.20 Audio encryption]'

_, tag, arguments = line.split(None, 2)
m = re.match(r"\[\S+ (.*)\]", arguments)
myDict[tag] = m.groups()[0]

当然,由于ID3语法看起来非常简单,你可以在没有正则表达式的情况下完成整个事情:

_, tag, arguments = line.split(None, 2)
myDict[tag] = arguments.strip(" []").split(None, 1)[1]

当然,如果line为空,当您尝试将值解压缩到ValueError时,python将引发_, tag, arguments。解决此问题的一种方法是在运行上述代码之前测试每行

for line in file_object:
    if line.strip():
        #the above code here.