我希望用dict
:TAG
对填充py definition
,我正在使用RegExr http://gskinner.com/RegExr/来编写正则表达式
我的第一步是从http://www.id3.org/id3v2.3.0或http://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
答案 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.