0

我正在编写一个从旧模板引擎模式中提取数据的脚本:

[%price%]
{
$54.99
}
[%/price%]

[%model%]
{
WRT54G
}
[%/model%]

[%brand%]{
LINKSYS
}
[%/brand%]

[% %] 中的所有内容都是键,{ } 中的所有内容都是值。使用 Python 和正则表达式,我能够做到这一点: (?<=[%)(?P\w*?)(?=\%])

返回 ['price', 'model', 'brand']

我只是在将括号数据作为值匹配时遇到问题

4

3 回答 3

4

我同意 Devin 的观点,即单个正则表达式不是最佳解决方案。如果确实有任何奇怪的情况没有被您的正则表达式处理,那么您将无法发现真正的风险。

我建议使用有限状态机方法。逐行解析文件,首先查找 price-model-brand 块,然后解析大括号内的任何内容。此外,请务必注意是否有任何块未正确打开或关闭,因为这些可能格式错误。

你应该能够在 python 中用大约 30-40 行代码编写这样的东西。

于 2009-03-29T22:34:29.697 回答
0

看起来使用re.Scanner(遗憾的是未记录)比使用单个正则表达式更容易。

于 2009-03-29T22:27:23.050 回答
0

只是为了笑:

import re
RE_kv = re.compile("\[%(.*)%\].*?\n?\s*{\s*(.*)")
matches = re.findall(RE_kv, test, re.M)
for k, v in matches:
    print k, v

输出:

price $54.99
model WRT54G
brand LINKSYS

请注意,我做了足够的正则表达式来显示匹配项,它甚至没有在结束时限制右括号。使用风险自负。

于 2009-03-29T22:52:13.600 回答