【问题标题】:How do I ensure I always get a list of matches from Python's Regular Expressions?如何确保始终从 Python 的正则表达式中获得匹配列表?
【发布时间】:2010-03-03 10:26:03
【问题描述】:

我正在尝试从类似于此的 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 ...>"]

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

【问题讨论】:

  • stackoverflow.com/questions/1732348/… ;) 好吧,也许对于这个简单的情况,正则表达式可能是合适的......但 bobince 的帖子同样值得一读。
  • 您不想继续尝试这样做。你真的必须停止尝试为 HTML 编写正则表达式并开始使用 Beautiful Soup。 crummy.com/software/BeautifulSoup
  • 感谢您的回复。明天我回来工作时,我会尝试一切。我将尝试通过提及我没有尝试做任何类似匹配标签的事情来平息大家的恐惧 - 因为它是格式错误的 xml,这些标签恰好为我需要的信息的开头和结尾提供了方便的标记,他们不需要完全匹配。在我的示例中,打开标签上缺少右括号实际上是故意的。
  • @S.Lott - 感谢您提供的信息,这东西太棒了。正是我需要的。

标签: python regex tuples findall


【解决方案1】:

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

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

如果您只想要&lt;html:button&gt; 位,请使用:

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

请注意,一般情况下,不可能匹配开始和结束标记(注意在上面的示例中,&lt;html:button&gt; 是打开的,&lt;/html:submit&gt; 是关闭的)。如果您需要这样做,请使用适当的解析器。

【讨论】:

  • 啊,你的似乎更接近 OP 样本,+1
【解决方案2】:

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

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

【讨论】:

  • 这实际上正是我正在寻找的信息。非常感谢你。不过,我想我会接受 S.Lott 的建议,也去看看 Beautiful Soup。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 2015-11-06
  • 1970-01-01
  • 2022-12-11
相关资源
最近更新 更多