【问题标题】:Match surrounding text around a group match围绕组匹配匹配周围的文本
【发布时间】:2014-07-09 09:44:05
【问题描述】:

这是一个例子:

<li><a href="link" target="_parent">1. Tips and tricks</a></li>

正则表达式:

/tips(?![^<]*>)/ig

匹配单词提示。

我想要做的是也能够匹配周围的文本,可能在另一个组中?

所以匹配可能是e.g. ["1. Tips and tricks", "Tips"].

你可以测试一下here

【问题讨论】:

  • 为什么不使用 HTML 解析器而不是正则表达式?
  • 您到底在寻找什么? &lt;a&gt; 标签之间的所有文本?
  • 我试图只查找文本节点,我发现使用正则表达式比遍历 DOM 容易得多。原因是我正在翻译文本的语言,因此我只需要文本信息。

标签: python regex regex-negation regex-lookarounds


【解决方案1】:

我认为你正在尝试得到这个,

>>> import re
>>> str = '<li><a href="link" target="_parent">1. Tips and tricks</a></li>'
>>> m = re.findall(r'((?<=>)\d+\.\s*(Tips)[^<]*)', str)
>>> m
[('1. Tips and tricks', 'Tips')]

>>> str = """
... <li>
... <a href="link" target="_parent">
... 1. Tips and tricks
... </a>
... </li>"""
>>> m = re.findall(r'\s*<a[^>]*>\n(\s*\S*\s*(\S*)[^\n]*)', str)
>>> m
[('1. Tips and tricks', 'Tips')]

【讨论】:

  • 我正在使用 re.finditer,它似乎没有为第一个解决方案返回任何结果。
  • 第二种方案效果不好,因为还剩下一些html标签。
  • 你能把实际的输入贴到 pastebin 里吗?
  • 这只是一个例子。它应该能够匹配 > 和 之间的任何东西
【解决方案2】:

根据您的评论,我认为使用BeautifulSoup 然后使用re.split 清理一下会更简单:

from bs4 import BeautifulSoup
import re

html = """<li class="selected ">
<a href="http://localhost:8888/translate_url" target="_parent">
          Learn the Basics: get iniciared
        </a>
<ul class="subtopics">
<li>
<a href="http://localhost:8888/translate_url" target="_parent">
                Tips and tricks
                </a>
</li>
<li>
<a href="http://localhost:8888/translate_url" target="_parent">
                Use bookmarks
                </a>
</li>"""

soup = BeautifulSoup(html)
text = re.split(r'\s{2,}', soup.get_text().strip())

输出:

['Learn the Basics: get iniciared', 'Tips and tricks', 'Use bookmarks']

soup.get_text() 获取页面中的所有文本。然后使用 strip() 删除前导和尾随空格,这样您的文本列表中就不会出现空字符串。

【讨论】:

    【解决方案3】:

    re 模块的 Python 文档指出:

    子组从左到右,从 1 向上编号。组可以嵌套;要确定数字,只需计算左括号字符,从左到右。

    因此,例如,以下(丑陋的)模式将匹配一组中的周围文本和示例链接中的目标词:

    /[^\n\s](.*basics(?![^<]*>).*)\n/ig
    

    您可以根据自己的情况对其进行优化!

    编辑:使用正则表达式解析 HTML 仍然是一个非常糟糕的主意,像 beautifulsoup 这样的东西会更健壮。

    【讨论】:

    • 我试图只查找文本节点,我发现使用正则表达式比遍历 DOM 容易得多。原因是我正在翻译文本的语言,因此我只需要文本信息。我用过beautifulsoup,但我发现与正则表达式相比,它的工作量更大。
    猜你喜欢
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    相关资源
    最近更新 更多