Возьмите две части одной короткой струны

Я ищу заполнить питона 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.
Другие вопросы по тегам