通过它们与搜索字符串的相对位置来识别字符串中的字符?

时间:2015-07-26 23:40:11

标签: python html regex string parsing

我想识别字符串中与我搜索的字符串相对的字符。

换句话说,如果我搜索'示例文字'在下面的字符串中,我想识别出来之前和之后的直接字符'示例文字'并且还有'<&#;和'>'。

例如,如果我在下面的字符串中搜索了&#39;示例文字&#39;,我希望函数返回<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/>"

4 个答案:

答案 0 :(得分:1)

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

  

给定一段文字,我如何捕捉封装它的html元素

非常不同的问题和一个永远不应该用正则表达式解决的问题。如果你想知道原因,只需谷歌吧。

就其他问题而言,捕获相关的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'

答案 1 :(得分:0)

使用正则表达式的原因:

  • 难以确定比赛前后返回的字符数。
  • 如果您匹配标签,如果搜索到的文字没有立即被标签包围,您会怎么做?
  • 义务:Tony the Pony says so

如果要解析HTML / XML,请使用HTML / XML解析器。 lxml是一个不错的选择,我个人更喜欢使用BeautifulSoup,因为它使用public IList<Article> getArticleByIdWithSortedSubarticles(int ArticleId) { var query = _articleRepository.Table; query = query.Where(a => ArticleId == a.Id) .Select(a => a); var subarticles = query.ToList(); return subarticles; } 进行繁重的工作,但也有其他功能,并且更加用户友好,尤其是快速比赛。

答案 2 :(得分:0)

我相信它可以由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,'') )

答案 3 :(得分:-2)

您可以使用正则表达式<[^>]*>来匹配标记,然后使用用括号定义的组将匹配项分离到您想要的块中:

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