【问题标题】:Identify characters in a string by their relative position to a searched string?通过字符串与搜索字符串的相对位置来识别字符串中的字符?
【发布时间】:2015-10-17 01:09:12
【问题描述】:

我想识别字符串中相对于我搜索的字符串定位的字符。

换句话说,如果我在下面的字符串中搜索“示例文本”,我想识别“示例文本”之前和之后的直接字符,并且还有“”。

例如,如果我在下面的字符串中搜索“示例文本”,我希望函数返回 <h3></h3>,因为它们是紧接在它之前和之后的字符。

String = "</div><p></p> Random Other Text <h3>Example Text</h3><h3>Coachella Valley Music &amp; Arts Festival</h3><strong>Random Text</strong>:Random Date<br/>"

【问题讨论】:

  • 你如何定义“之前和之后的立即字符”? &lt;h3&gt; 是 4 个字符,而 &lt;/h3&gt; 是 5 个字符。如果是 &lt;span id="example_text"&gt; 怎么办?
  • 这听起来像是一个 XY 问题。您应该使用 xml 解析器,例如 lxml,并通过文本进行 xpath 搜索。任何用正则表达式解析的 html 都只会以泪水告终。
  • 为什么要用正则表达式解析 html?
  • @PadraicCunningham,我没有意识到不应该用正则表达式解析 html。如果有人犯同样的错误,我会将正则表达式作为标签。

标签: python html regex string parsing


【解决方案1】:

我不相信你在这里问的问题是正确的。我认为您的实际目标是:

给定一段文本,如何捕获封装它的html元素

非常不同的问题,一个永远不应该用正则表达式解决的问题。如果您想知道原因,只需 google 即可。

就其他问题和捕获相关的 html 标记而言,我建议使用 lxml。可以在here 找到文档。对于您的用例,您可以执行以下操作:

>>> from lxml import etree
>>> from StringIO import StringIO

>>> your_string = "</div><p></p> Random Other Text <h3>Example Text</h3><h3>Coachella Valley Music &amp; Arts Festival</h3><strong>Random Text</strong>:Random Date<br/>"

>>> parser = etree.HTMLParser()
>>> document = etree.parse(StringIO(your_string), parser)
>>> elements = document.xpath('//*[text()="Example Text"]')

>>> elements[0].tag
'h3'

【讨论】:

  • 我收到以下错误:NameError: global name 'StringIO' is not defined
【解决方案2】:

使用正则表达式的原因:

  • 难以定义匹配前后返回的字符数。
  • 如果匹配标签,如果搜索到的文本没有立即被标签包围怎么办?
  • 必填:Tony the Pony says so

如果您要解析 HTML/XML,请使用 HTML/XML 解析器。 lxml 是一个不错的选择,我个人更喜欢使用BeautifulSoup,因为它使用lxml 来完成一些繁重的工作,但也有其他功能,并且更人性化,尤其是快速匹配。

【讨论】:

  • @SlaterTyranus 如其他地方所述,您的代码会因有效的 HTML 片段而无效的 XML 中断。
  • @heinst 您在上一条评论中绝对错误。你的答案并不可靠。 是我投反对票的原因。如果它奏效了,我就不会那样做。抱怨如此糟糕,因为它按预期工作是没有意义的。
  • @MattDMo 我还想指出,这并不是真正的答案...我假设您要删除它或添加答案?
  • @Slater 为什么这不是一个答案?
【解决方案3】:

相信beautifulsoup可以做到

from BeautifulSoup import BeautifulSoup

String = "</div><p></p> Random Other Text <h3>Example Text</h3><h3>Coachella Valley Music &amp; Arts Festival</h3><strong>Random Text</strong>:Random Date<br/>"

soup = BeautifulSoup(String)

input = 'Example Text'
for elem in soup(text=input):
    print(str(elem.parent).replace(input,'') )

【讨论】:

    【解决方案4】:

    您可以使用正则表达式&lt;[^&gt;]*&gt; 来匹配标签,然后使用用括号定义的组将您的匹配分隔成您想要的块:

    m = re.search("(<[^>]*>)Example Text(<[^>]*>)", String)
    m.groups()
    Out[7]: ('<h3>', '</h3>')
    

    【讨论】:

      猜你喜欢
      • 2015-10-05
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      相关资源
      最近更新 更多