我正在尝试匹配可能包含或不包含标签的文本块。
我正在使用一个大型数据集,我需要在其中标记数据集的特定部分,并给出需要标记的特定字符串。但是,当我在其中一个文本块中标记某些内容时,我无法再使用我的正则表达式来查找它。
基本上我需要的是能够匹配一个字符串,无论它是否在它之间有标记。
一个例子是:
我需要在包含
的文件中搜索数据块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中工作,但由于这只是一个正则表达式问题,我不相信它特别相关。
答案 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>