【发布时间】:2013-02-10 18:32:50
【问题描述】:
我在 Python(3) 中使用 re 模块,想用以下格式替换 (re.sub(regex, replace, string)) 字符串
"foo <bar e word> f ga <foo b>"
到
"#foo <bar e word> #f #ga <foo b>"
甚至
"#foo #<bar e word> #f #ga #<foo b>"
但我无法将单个单词与 <...> 构造中的单词边界隔离开来。
帮助会很好!
附注 1
整个故事是一部音乐剧: 我有 Lilypond 格式的字符串(或者更好的是,非常简单的核心格式的一个子集,只是音符和持续时间),并希望将它们转换为 python 对 int(duration),list(of pitch strings)。性能并不重要,所以我可以来回转换它们,使用 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个数字在>后面,不允许有空格
附注2
目标不是创建 Lilypond 解析器。它真的只是用于非常短的sn-ps,没有额外的功能,没有插入注释的扩展。如果这不起作用,我会选择另一种格式(简化),如 ABC。所以任何与 Lilypond 相关的事情(“通过 lilypond 运行它,让它在 Scheme 中给出音乐数据,解析它”)或其工具链肯定不是这个问题的答案。该软件包甚至没有安装。
【问题讨论】: