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

发布于 2024-08-24 01:00:43 字数 545 浏览 6 评论 0原文

我试图从 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 ...>"]

获得我期望的结果的适当方法是什么?

I'm trying to pull some information (no recursion necessary) from a jsp page (malformed xml) similar to this:

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

And a regex:

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

re.findall() is giving me a list of tuples, like so:

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

Which I understand from the documentation is correct, but I'm looking to get something more like:

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

What is the appropriate way to get the outcome I expect?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

美人如玉 2024-08-31 01:00:43

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

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

如果您只想要 位,使用:

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

例如

<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')

请注意,通常不可能匹配开始和结束标记(请注意<在上面的示例中,code>打开, 关闭)。如果您需要这样做,请使用适当的解析器。

Aside from the fact that a regex probably isn't what you want to do this with, you want to put the bit you want in groups using parentheses. If you want everything up to the closing </html:whatever> tag, then you want something like this:

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

If you just want the <html:button> bit, use:

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

e.g.

from

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

you get:

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

If you want to get the foobar from above, use:

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

to get:

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

Note that it is not, in general, possible to match opening and closing tags (note that <html:button> is opened, and </html:submit> closes in the example above). If you need to do that, use a proper parser.

度的依靠╰つ 2024-08-31 01:00:43

您的 (button|submit|cancel) 正在被捕获,因此请在方括号中添加 ?:,例如 (?:

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

Your (button|submit|cancel) getting capture, so add ?: in brackets like (?:

>>> re.findall('<html:(?:button|submit|cancel)[\s\S]*?</html:(?:button|submit|cancel)>',TheHTMLWhichShouldntParseWithRegex)
['<html:button ...></html:button>', '<html:submit ...></html:submit>']
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文