【问题标题】:Flatten regex group matches展平正则表达式组匹配
【发布时间】:2020-02-09 23:34:03
【问题描述】:

总结

我创建了一个正则表达式,它将从一个 html 页面中获取多个不同的数据。它使用非捕获组内的分组备选方案。获取所需数据的效果非常好;但是,这些组并没有在尽可能少的匹配中组合测试器

在编写代码时,我认为在线正则表达式测试器的匹配和组似乎有点奇怪,但直到我在 python 中工作后,我才注意到我的组层次结构存在问题。

我唯一的解决办法似乎是……

  1. 重写正则表达式以使每个匹配有 5 个匹配组
  2. 编写 python 代码来扁平化数据结构。
  3. 别的什么???

上面的数字 1 会更好。我不想用不需要的代码“污染”我的代码库

代码

正则表达式

^.*(?:<p.*>(.*)|<span>(.*)<\/span>|<a href=\"(.*linux(?:\.tar\.gz|.zip))\">(.*)</a>.*\((.*) bytes\))

游乐场 https://regex101.com/r/MC8TOv/1/

网页抓取的网站 https://android-dot-devsite-v2-prod.appspot.com/studio/archive_25350a46834ddb86754aba2445ff1359aa7fd8cb296923255092494ac94ef531.frame

Python

使用 BeautifulSoup 时

import re

...

regex = r"^.*(?:<p.*>(.*)|<span>(.*)<\/span>|<a href=\"(.*linux(?:.tar.gz|.zip))\">(?P<filename>.*)</a>.*\((.*) bytes\))"          
match = re.findall(regex, str(soup_html), re.M)

print(match)

期望

我得到了什么这是我得到的一些通用输出。

 [
     ('A1', '', '', '', ''),
     ('', 'B1', '', '', ''),
     ('', '', 'C1', 'D1', 'E1'),
     ('A2', '', '', '', ''),
     ('', 'B2', '', '', ''),
     ('', '', 'C2', 'D2', 'E2'),
     ...
 ]

我想要什么

 [
     ('A1', 'B1', 'C1', 'D1', 'E1'),
     ('A2', 'B2', 'C2', 'D2', 'E2')
     ...
 ]

再一次,有没有办法重写正则表达式,使每场比赛有 5 个匹配的组?

【问题讨论】:

  • 为什么投反对票?这怎么不显示研究或不清楚?

标签: python regex python-3.x regex-group flatten


【解决方案1】:

如果这五件事必须按照您的示例显示的顺序出现,请将它们与.*? 组合在一起,而不是|

(regex1).*?(regex2).*?(regex3).*(regex4).*?(regex5)

而不是

(regex1)|(regex2)|(regex3).*(regex4).*?(regex5)

另一方面,如果它们不一定要按此顺序出现,那么我不太明白您希望如何将它们硬塞到严格的五组结构中。

无论哪种方式,您都可以在应用正则表达式后对结果进行后处理。

【讨论】:

  • 数据是定期排列的,所以从技术上讲,像这样的东西可以工作,但我需要重新设计它。我的代码基于多行并使用每行的开头。此逻辑已被删除
  • 这似乎因换行而失败
猜你喜欢
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
相关资源
最近更新 更多