You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python动态获取字符串中多个子串的跨度?

解决方案

核心思路

要动态获取目标指标在原始文本中的字符跨度,需按以下三步处理:

  1. 清洗原始文本:去除HTML标签,得到纯文本(标签不计算在字符位置内)
  2. 提取目标指标单元:从简化的指标字符串中拆分出独立的「指标-值」组合
  3. 模糊匹配定位:忽略大小写差异,在纯文本中找到每个指标单元的起始和结束索引

具体实现(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:15:37