【问题标题】:Parsing template schema with Python and Regular Expressions使用 Python 和正则表达式解析模板模式
【发布时间】:2010-10-16 06:44:43
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: python regex parsing grouping


    【解决方案1】:

    只是为了笑:

    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
    

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 在“品牌”标签示例中甚至有一种情况是在同一行开始左大括号而不是前两个。正则表达式可以工作,但状态机 a-la sax 解析器会更好。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-16
        • 1970-01-01
        • 1970-01-01
        • 2013-12-31
        • 1970-01-01
        • 2017-12-23
        相关资源
        最近更新 更多