Возьмите две части одной короткой струны
Я ищу заполнить питона dict
с TAG
: 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.
Как мне получить определение, т. Е. (Audio encryption)
тега ID3v2 из строки, используя RegEx?
редактировать: благодаря ответам, которые я получил от mVChr
Я написал это для всех остальных, пытающихся сделать то же самое: http://pastebin.com/0nT74dpB
2 ответа
Вы должны использовать группы захвата ()
вытащить только то что нужно
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'
Что-то вроде этого? Обратите внимание, как я только что использовал 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
пуст, Python поднимет ValueError
когда вы пытаетесь распаковать значения в _, tag, arguments
, Один из способов исправить это - проверить каждую строку перед запуском приведенного выше кода:
for line in file_object:
if line.strip():
#the above code here.