【问题标题】:Python regex - match a number of timesPython regex - 匹配多次
【发布时间】:2018-09-22 13:00:58
【问题描述】:

我想匹配一个字符特定的次数。 例如,我想匹配一个 HTML 字符串中的作者姓名,如下所示:

base>"author's name"</span>

以下正则表达式匹配“base>”和“/span>”之间的任何字符,并仅返回作者姓名:

base>\s*(.*?)(?=\s*<\/span>)

但是,HTML 文件包含 50 个这样的实例,并且上面的正则表达式返回所有 50 个匹配项。我将如何修改它以便只返回匹配的前 10 个实例?

【问题讨论】:

  • 我认为这是不可能的。只需获取所有这些,只考虑前 10 个。
  • 您可以通过在整个表达式之后使用语法 {n} 将匹配项限制为“n”,这样将是“(base>\s*(.*?)(?=\s *)){10}"
  • @AhmedAshrafGamal 不会按顺序匹配字符串 10 次吗?而不是文本中的任何地方?
  • @BartFriederichs 你是对的,我认为是这样,如果不是,那么就像你说的那样,考虑到比赛的前 10 个结果将是正确的选择。
  • 你可以在第 10 场比赛中使用 finditerbreak

标签: python regex python-3.x


【解决方案1】:

可以创建一个正则表达式来捕获该正则表达式的前十个实例,方法是将其连接在由.*? 分隔的自身之后。然后,您可以使用前十个捕获组来提取作者:

base&gt;\s*(.*?)(?=\s*&lt;\/span&gt;).*?base&gt;\s*(.*?)(?=\s*&lt;\/span&gt;).*?base&gt;\s*(.*?)(?=\s*&lt;\/span&gt;).*?base&gt;\s*(.*?)(?=\s*&lt;\/span&gt;).*?base&gt;\s*(.*?)(?=\s*&lt;\/span&gt;).*?base&gt;\s*(.*?)(?=\s*&lt;\/span&gt;).*?base&gt;\s*(.*?)(?=\s*&lt;\/span&gt;).*?base&gt;\s*(.*?)(?=\s*&lt;\/span&gt;).*?base&gt;\s*(.*?)(?=\s*&lt;\/span&gt;).*?base&gt;\s*(.*?)(?=\s*&lt;\/span&gt;)

然而,这不是您通常想要做的,因为它使得更改您搜索的作者数量变得相对困难。查找所有捕获并仅使用前几个捕获可能会占用更多 CPU,但会更容易响应不断变化的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 2018-02-14
    • 2013-07-04
    • 2015-05-03
    • 2018-09-17
    相关资源
    最近更新 更多