【问题标题】:Regex: match text between 2 items正则表达式:匹配两个项目之间的文本
【发布时间】:2013-08-05 01:47:40
【问题描述】:

我如何匹配下面的代码来获得两个字符串:

  1. 结束标签的第三个标题
  2. 第二个标题到第 6 个结束一个标签。(等等...第三个标题到第 9 个结束一个标签...等等)

这里是要匹配的字符串:

title
<a></a>
content here
<a></a>
text...
<a></a>
text...
title 
<a></a>
<a></a>
<a></a>

我尝试使用 .* 但这捕获了从标题到最后一个标签的文本。

【问题讨论】:

  • 我希望您没有使用正则表达式解析 HTML! stackoverflow.com/a/1732454/188
  • 这是一个6层​​嵌套的锚元素吗?这个页面到底在做什么?
  • @Matthew,代码格式永远不会改变,所以我认为在这种情况下使用正则表达式解析 html 没有任何问题......
  • “永不改变”,直到它改变为止。我有时会使用正则表达式从 HTML 中提取数据,但通常启动适当的解析器并获取所需的位同样容易。
  • 就像@MatthewSchinckel 说的那样,您可以使用诸如 beautifulSoup 或 lxml 包之类的东西更快地完成这项工作。

标签: python html regex parsing


【解决方案1】:
from re import findall, DOTALL

text = '''
title
<a></a>
content here
<a></a>
text...
<a></a>
text...
title 
<a></a>
<a></a>
<a></a>
'''
print findall(r'title.*?</a>.*?</a>.*?</a>', text, DOTALL)

给予

['title\n<a></a>\ncontent here\n<a></a>\ntext...\n<a></a>', 'title \n<a></a>\n<a></a>\n<a></a>']

你也可以使用

print findall(r'title(?:.*?</a>){3}', text, DOTALL)

【讨论】:

    【解决方案2】:

    一般* 是贪婪的,而*? 是不情愿的。尝试将.* 替换为.*?

    【讨论】:

    • .*?只会从标题到它后面的第一个
    • 是的,因此您可以应用它(顺序或嵌套)三次以获得结果。 Matthew Schinckel 的第二条评论也可能会派上用场。
    猜你喜欢
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 2016-05-04
    • 2019-03-21
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多