Я использую модуль re в Python (3) и хочу заменить (re.sub (regex , заменить строку)) строку в следующем форматеРегулярное выражение, которое принимает <...> как один элемент в «foo bar <hello world> и т. Д.» (Цель: Простая музыка/синтаксический анализ lilypond)
"foo <bar e word> f ga <foo b>"
к
"#foo <bar e word> #f #ga <foo b>"
или даже
"#foo #<bar e word> #f #ga #<foo b>"
Но я не могу изолировать отдельные слова от границ слов в пределах конструкции < ...>.
Справка будет приятной!
PS 1
Вся история музыкальной один: У меня есть строки в формате LilyPond (или лучше, подмножество очень простой формат ядра, просто отмечает и длительности) и хотите конвертировать их к парам python int (продолжительность), списку (строк основного тона). Производительность не важна, поэтому я могу конвертировать их туда и обратно, перебирать списки python, разделять строки и присоединяться к ним снова и т. Д. Но для вышеупомянутой проблемы я не нашел ответа.
Источник Строка
"c'4 d8 < e' g' >16 fis'4 a,, <g, b'> c''1"
должно привести к
[
(4, ["c'"]),
(8, ["d"]),
(16, ["e'", "g'"]),
(4, ["fis'"]),
(0, ["a,,"]),
(0, ["g", "b'"]),
(1, ["c''"]),
]
основной формат строки + Номер так: e4 bes16
- Элемент списка
- строка может состоять из нескольких, по крайней мере одного, [a-zA-Z] символов
- за строкой следует ноль или более цифр: e bes g4 c16
- строка за ней следует ноль или более 'или (не комбинируется): e' bes, f '' '2 g ,, 4
- строка может быть заменена на список строк, список лимитеры <>: 4 число приходит позади>, нет места позволили
PS 2
Цель состоит не в создании парсера Lilypond. Это действительно только для очень коротких фрагментов без дополнительной функциональности, без расширений для вставки заметок. Если это не сработает, я бы пошел на другой формат (упрощенный), такой как ABC. Так что все, что связано с Lilypond («Запустите его через lilypond, пусть он выдаст музыкальные данные в Scheme, проанализируйте это»), или его инструментальная цепочка, безусловно, НЕ является ответом на этот вопрос. Пакет даже не установлен.
Я обновил этот ответ с быстрым и грязным решением первого постскриптума. –
принято как ответ, потому что использование только стандартных библиотек python – nilsge