【发布时间】:2014-07-02 20:20:54
【问题描述】:
我正在 python 中编写一个正则表达式来捕获 SSI 标记内的内容。
我要解析标签:
<!--#include file="/var/www/localhost/index.html" set="one" -->
分为以下几部分:
- 标签功能(例如:
include、echo或set) - 属性名称,位于
=符号之前 - 属性值,位于
"之间
问题是我不知道如何获取这些重复组,因为名称/值对可能在标签中出现一次或多次。我在这上面花了几个小时。
这是我当前的正则表达式字符串:
^\<\!\-\-\#([a-z]+?)\s([a-z]*\=\".*\")+? \-\-\>$
它捕获第一组中的include 和第二组中的file="/var/www/localhost/index.html" set="one",但我所追求的是:
group 1: "include"
group 2: "file"
group 3: "/var/www/localhost/index.html"
group 4 (optional): "set"
group 5 (optional): "one"
(continue for every other name="value" pair)
【问题讨论】:
-
一次捕获所有标签
((?:[a-z]=".*")+?) -->$,然后解析它。您的正则表达式也被不必要地转义了! -
@AdamSmith:这对我不起作用。应用该正则表达式时,我得到了两组:
group 0 : e="/tmp/index.html" set="one" -->,group 1: e="/tmp/index.html" set="one" -
为什么不使用不同的模式呢?它会让事情变得更简单。
-
@PadraicCunningham 我曾想过这样做,但我希望可以不这样做。我没有意识到看起来微不足道的事情需要付出多少努力。
-
单独的模式非常简单,如果你想从键值对创建一个字典,它会很容易完成。