我如何确保始终从Python的正则表达式中获取匹配列表?

时间:2010-03-03 10:26:04

标签: python regex tuples findall

我试图从jsp页面(格式错误的xml)中提取一些信息(不需要递归),类似于:

<td>
<html:button ...></html:button>
<html:submit ...></html:submit></td>

正则表达式:

<html:(button|submit|cancel)[\s\S]*?</html:(button|submit|cancel)>

re.findall()给我一个元组列表,如下:

[('button','button'),('button','button')]

我从文档中理解的是正确的,但我希望得到更多类似的内容:

["<html:button ...>","<html:button ...>"]

获得预期结果的恰当方法是什么?

2 个答案:

答案 0 :(得分:3)

除了正则表达式可能不是您想要执行此操作的事实之外,您还希望使用括号将所需的位放入组中。如果您希望所有内容都达到结束</html:whatever>标记,那么您需要这样的内容:

(<html:(button|submit|cancel)[\s\S]*?)</html:(button|submit|cancel)>

如果您只想要<html:button>位,请使用:

(<html:(button|submit|cancel)>)[\s\S]*?</html:(button|submit|cancel)>

e.g。

<html:button>foobar</html:submit>

你得到:

('<html:button>', 'button', 'submit')

如果您想从上面获取foobar,请使用:

(<html:(button|submit|cancel)>)([\s\S]*?)</html:(button|submit|cancel)>

得到:

('<html:button>', 'button', 'foobar', 'submit')

请注意,通常不能匹配开始和结束标记(请注意,<html:button>已打开,</html:submit>在上面的示例中已关闭)。如果您需要这样做,请使用正确的解析器。

答案 1 :(得分:1)

您的(button|submit|cancel)被捕获,因此请在?:

等括号中添加(?:
>>> re.findall('<html:(?:button|submit|cancel)[\s\S]*?</html:(?:button|submit|cancel)>',TheHTMLWhichShouldntParseWithRegex)
['<html:button ...></html:button>', '<html:submit ...></html:submit>']