【问题标题】:Python Findall not grabbing all matches [closed]Python Findall没有抓住所有匹配项[关闭]
【发布时间】:2020-06-02 08:16:38
【问题描述】:

我正在抓取网页的 HTML 代码,目前正在尝试构建一个正则表达式来获取我需要的信息。 在我的示例中,该模式重复了大约 20 次,如下所示: 它应该以 tivo 开头(因为它将以 Ativo 或 Inativo 开头)并且应该以“Ver Detalhes”结尾。 正如我之前所说,这种模式重复了大约 20 次。

我使用的代码行是:

posts=re.findall('(ativo.*?ver det)',text,re.IGNORECASE)

但它不起作用,因为它只是得到 12 场比赛,我不明白为什么。 我试过使用 .* 而不是 .*?但随后它只提取 3 个匹配项。

该文件可在以下链接中找到: Source file

这是可以提取的东西吗?

【问题讨论】:

  • 您的文件不起作用(404),您的模式以“ativo”开头(尽管您说的是“tivo”),最后. 将不匹配换行符 默认情况下,因此该模式仅在所有位都在同一行时才有效(除非您选择使用re.DOTALL)。
  • 您是否介意在您的问题中包含示例数据。我建议不要使用外部链接
  • @TimBiegeleisen 我想请您停止重新打开明显的欺骗行为。请考虑重新关闭。
  • @TimBiegeleisen 您可以使用 Python regex, matching pattern over multiple lines.. why isn't this working? 作为关闭理由。
  • 您为什么接受了一个无效解决方案的答案?您不必仅仅因为它是唯一的答案就接受它。你的问题是重复的。它应该被关闭,并删除下面的答案,因为回答者不想/无法修复代码。

标签: python regex


【解决方案1】:

也许您想要的某些匹配出现在一行或多行中,在这种情况下,您的模式中的 .* 将无法识别。一种解决方案是在启用“全点”模式的情况下进行搜索,例如

posts = re.findall('\b(?:in)?ativo.*?ver detalhes\b', text, flags=re.IGNORECASE|re.DOTALL)

我根据您在问题中所说的逐字给出了这个答案:

应该以“Ver Detalhes”结尾

如果你真的希望比赛以ver det 结束,那么使用:

posts = re.findall('\b(?:in)?ativo.*?ver det', text, flags=re.IGNORECASE|re.DOTALL)

【讨论】:

  • 模式错误,它不会匹配 OP 文本中的任何内容。此外,您不知道文本的各个部分之间是否有任何换行符。如果唯一的问题是re.S,则无需重新回答老问题。
  • 这种方式似乎根本不返回任何东西
  • @GustavoPacheco 当然。尝试使用您的模式,但使用flags=re.IGNORECASE|re.DOTALL。或者只是posts=re.findall('(?is)ativo.*?ver det',text)
  • 你是个天才我爱你。 5 小时尝试任何事情,似乎这就是原因。你能解释一下为什么会这样吗?
  • @GustavoPacheco 我已经做到了。见this post of mine
猜你喜欢
  • 2020-01-28
  • 2019-08-30
  • 1970-01-01
  • 2022-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
相关资源
最近更新 更多