0

我正在寻找dictTAG:definition对填充 python,并且我正在使用 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,但它失败了。如果我删除.+?并替换它就可以了_As出了什么问题?*下划线代表空格,SO 上不显示。

如何(Audio encryption)使用 RegEx 从行中获取 ID3v2 标签的定义?

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

4

2 回答 2

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'
于 2012-07-03T21:06:01.213 回答
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当你尝试将值解包到_, tag, arguments. 解决此问题的一种方法是在运行上述代码之前测试每一行:

for line in file_object:
    if line.strip():
        #the above code here.
于 2012-07-03T21:25:31.893 回答