gpt4 book ai didi

Python:在元组中存储许多正则表达式匹配项?

转载 作者:太空狗 更新时间:2023-10-30 02:22:34 25 4
gpt4 key购买 nike

我正在尝试使用正则表达式制作一个简单的基于 Python 的 HTML 解析器。我的问题是尝试让我的正则表达式搜索查询找到所有可能的匹配项,然后将它们存储在一个元组中。

假设我有一个页面,其中存储在变量 HTMLtext 中:

<ul>
<li class="active"><b><a href="/blog/home">Back to the index</a></b></li>
<li><b><a href="/blog/about">About Me!</a></b></li>
<li><b><a href="/blog/music">Audio Production</a></b></li>
<li><b><a href="/blog/photos">Gallery</a></b></li>
<li><b><a href="/blog/stuff">Misc</a></b></li>
<li><b><a href="/blog/contact">Shoot me an email</a></b></li>
</ul>

我想对该文本执行正则表达式搜索并返回一个包含每个链接的最后一个 URL 目录的元组。所以,我想返回这样的东西:

pages = ["home", "about", "music", "photos", "stuff", "contact"]

到目前为止,我可以使用正则表达式搜索一个结果:

pages = [re.compile('<a href="/blog/(.*)">').search(HTMLtext).group(1)]

运行这个表达式使得pages = ['home']

如何让正则表达式搜索继续整个文本,将匹配的文本附加到这个元组?

(注意:I know I probably should NOT be using regex to parse HTML。但我还是想知道如何做到这一点。)

最佳答案

您的模式不适用于所有输入,包括您的输入。 .*将过于贪婪(从技术上讲,它会找到最大匹配),导致它成为第一个 href 和最后一个相应的关闭。解决此问题的两种最简单的方法是使用最小匹配或否定字符类。

# minimal match approach
pages = re.findall(r'<a\s+href="/blog/(.+?)">',
full_html_text, re.I + re.S)

# negated charclass approach
pages = re.findall(r'<a\s+href="/blog/([^"]+)">',
full_html_text, re.I)

强制警告

对于简单且合理约束的文本,正则表达式就可以了;毕竟,这就是我们在编辑 HTML 时在文本编辑器中使用正则表达式搜索和替换的原因!然而,你对输入的了解越少,它就会变得越来越复杂,比如

  • 如果 <a 之间有其他字段介入和 href , 比如 <a title="foo" href="bar">
  • 大小写问题,例如 <A HREF='foo'>
  • 空白问题
  • 替代引号,如 href='/foo/bar'而不是 href="/foo/bar"
  • 嵌入 HTML 注释

这不是唯一的问题 list ;还有其他人。所以,using regexes on HTML thus is possible但是否方便取决于太多其他因素来判断。

但是,从您展示的小示例来看,它看起来非常适合您自己的情况。您只需完善您的模式并调用正确的方法。

关于Python:在元组中存储许多正则表达式匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9855306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com