如何用Python动态获取字符串中多个子串的跨度?
解决方案
核心思路
要动态获取目标指标在原始文本中的字符跨度,需按以下三步处理:
- 清洗原始文本:去除HTML标签,得到纯文本(标签不计算在字符位置内)
- 提取目标指标单元:从简化的指标字符串中拆分出独立的「指标-值」组合
- 模糊匹配定位:忽略大小写差异,在纯文本中找到每个指标单元的起始和结束索引
具体实现(Python示例)
步骤1:清洗原始文本
用BeautifulSoup剥离HTML标签,保留原始文本的空格与格式:
from bs4 import BeautifulSoup import re # 原始富文本 raw_text = '<p><strong>xxxx <code>BP 160/110</code> 12/6/2018 sitting left arm @xyz hospital xxxx <code>HgbA1c 12%</code> on 21/1/2019 xxxx</strong></p>' # 清洗得到纯文本 soup = BeautifulSoup(raw_text, 'html.parser') cleaned_raw = soup.get_text(strip=False)
清洗后纯文本为:xxxx BP 160/110 12/6/2018 sitting left arm @xyz hospital xxxx HgbA1c 12% on 21/1/2019 xxxx
步骤2:提取目标指标单元
从简化指标字符串中拆分出需要匹配的单元,用正则适配「指标+值」的组合:
# 简化的指标字符串 target_str = '<p><strong>bp 160/110 hgba1c 12%</strong></p>' # 清洗目标字符串 target_soup = BeautifulSoup(target_str, 'html.parser') cleaned_target = target_soup.get_text() # 提取指标单元 pattern = re.compile(r'(\w+\s+\S+)', re.IGNORECASE) target_units = pattern.findall(cleaned_target) # 得到:['bp 160/110', 'hgba1c 12%']
步骤3:定位指标跨度
遍历每个指标单元,在清洗后的原始文本中搜索匹配,记录索引:
spans = [] for unit in target_units: # 忽略大小写匹配目标单元 match = re.search(re.escape(unit), cleaned_raw, re.IGNORECASE) if match: spans.append((match.start(), match.end())) print(spans) # 输出:[(5, 15), (62, 72)]
动态适配说明
- 大小写兼容:通过
re.IGNORECASE实现大小写不敏感匹配,适配BP/bp、HgbA1c/hgba1c这类变化 - 格式鲁棒性:如果指标有格式变体(如
B.P. 160/110、HbA1c:12%),可调整正则为r'(\w+\.?\w*\s*[:]?\s*\S+)',兼容带点、冒号的情况 - 重复指标处理:若原始文本存在重复指标,可改用
re.finditer遍历所有匹配结果,按需选择对应位置
内容的提问来源于stack exchange,提问作者Aditya Kumar Barik
相关产品推荐
相关产品推荐

