使用正则表达式将文本块与其中的随机标记进行匹配

时间:2016-07-13 19:28:15

标签: python html regex

我正在尝试匹配可能包含或不包含标签的文本块。

我正在使用一个大型数据集,我需要在其中标记数据集的特定部分,并给出需要标记的特定字符串。但是,当我在其中一个文本块中标记某些内容时,我无法再使用我的正则表达式来查找它。

基本上我需要的是能够匹配一个字符串,无论它是否在它之间有标记。

一个例子是:

我需要在包含

的文件中搜索数据块abc123xyz

abc123xyz /newblock testingabc123 /newblock bleh123xyz

,我需要将abc标记为<tag1>,将<abc123>标记为<tag2>。但显然,当我最初将abc标记为<tag1>并创建字符串<tag1>abc</tag1>123xyz时,我再也找不到字符串abc123xyz,也找不到字符串abc123

我首先需要找到abc123xyz,因为数据文件中可能有多个abc

这是数据集中的示例字符串。

CDATA[Bvhhg Iebhe:<br /> <br />8/15/73 dc eqedhethv dy tgjp teyzuvj aggmc ej jpdc jdmv.<br /> <br />Ujjeopvf nhvecv xdyf gua 1673 kvffdyr neoivj kdjp gua mvyuc, nadodyr, Lqvyj Fghdodvc, eyf xavzuvyjhb ecivf zuvcjdgyc. <br /> <br />Uxjva avqdvkdyr jpv dyxgamejdgy, dx bgu peqv eyb zuvcjdgyc, nhvecv ogyjeoj mv.  Thank you.<br /> <br />Ovtgaep Jerygy<br />Kehvc eyf Mejvadyr Yeyerva<br />339 922-1323 vlj. 1576<br />vqvyjc@vfrvkggfjepgv.ogm<br /> <br /> <br /> <br /> <br /> <br /> <br />

你可以看到,非常难看,并且还包含原始格式标签。 在此示例中,我可能需要自己标记Thank you.,但也包含在较大的标记中,该标记仅排除在Thank you.之后找到的数据

我真的不知道如何做到这一点。我可能只是想错了方向,但我还没有接近解决方案。

我在python 2.7中工作,但由于这只是一个正则表达式问题,我不相信它特别相关。

1 个答案:

答案 0 :(得分:1)

我最好能理解上面评论主题的要求,我相信这段代码可以达到预期效果。我们的想法是,每个被搜索的文本都会成为一个正则表达式,忽略XML样式标记,无论它们存在于搜索词中。例如。 'abc'成为正则表达式,如((<[^>*)>)*a(<[^>*)>)*b(<[^>*)>)*c(<[^>*)>)*)

import itertools
import re

def tag(document, text, tagname):
    tagre = '(?:<[^>]*>)*'

    regex = '(' + tagre + ''.join(
        itertools.chain(*zip(
            map(re.escape, text),
            itertools.cycle([tagre])))) + ')'

    return re.sub(regex,
        r'<{tagname}>\1</{tagname}>'.format(tagname=re.escape(tagname)),
        document)

document = 'abc123xyz...'
document = tag(document, 'abc', 'tag1')
document = tag(document, 'abc12', 'tag2')
document = tag(document, '123', 'tag3')
document = tag(document, 'abc123xyz', 'tag4')
document = tag(document, '...', 'tag5')

print(document)

# Output:
# <tag4><tag2><tag1>abc<tag3></tag1>12</tag2>3</tag3>xyz</tag4>