首页 > 解决方案 > 计算正则表达式的匹配索引

问题描述

<a>我有一个 txt 文件 f,其中包含和标记之间的特定标记跨度</a>

例如:

<a>George</a> and his <a>friends</a>, came back <a>home</a>.

我使用 re's 匹配这些finditer,但如果标签不是文本的一部分,我希望能够计算它们的索引。

例如,如果:乔治和他的朋友们回家了。

我所做的是

import re
text = "<a>George</a> and his <a>friends</a>, came back <a>home</a>"
tags = re.finditer('(?<=<a>).*?(?=</a>)',f)

获取标签以及跨度的开始和结束,然后

opening = re.finditer(r"<a>", f)
opening = [(i.group(0), i.start(), i.end()) for i in opening]

closing = re.finditer(r"</a>", f)
closing = [(i.group(0), i.start(), i.end()) for i in closing]

还可以获得跨度的开始和结束标签的索引。

如果标签不是文本的一部分,我该如何计算跨度的索引?我最初想分别从跨度的开始和结束处减去 -3,但是对于下一个跨度,这不起作用,因为我需要减去 -3 + 结束标记和开始标记之间的距离(我认为) .

我无法获取跨度然后在“干净”文本中查找它们,因为它们的位置是特定的,并且我不想匹配同一个单词的多次出现。

标签: pythonregex

解决方案


计算处理的标签数量并相应地减去长度。

import re
text = "<a>George</a> and his <a>friends</a>, came back <a>home</a>"
tags = re.finditer('(?<=<a>).*?(?=</a>)',text)

num_tags = 0
results = []
for tag in tags:
    start_idx = tag.start() - 7*num_tags - 3 
    end_idx = tag.end() - 7*num_tags - 4
    num_tags += 1
    results.append((tag.group(0),start_idx, end_idx))

推荐阅读