如何定位句子指定子串内目标字符在原字符串中的位置
解决方法
你可以通过「先定位子串在原句的偏移量,再叠加目标字符在子串内的相对位置」的方式精准定位,具体实现如下:
核心思路
- 先找到你提取到的子串
for 1 week在原句中的起始索引 - 再找到目标字符
1在子串内部的相对索引 - 两个索引相加,就是目标字符在原句中的绝对位置
代码示例
import re # 原句 original_sentence = "Take 1 tablet in the morning and at noon for 1 week" # 你通过NLP提取到的子串 extracted_substr = "for 1 week" # 1. 定位子串在原句的起始位置 sub_match = re.search(re.escape(extracted_substr), original_sentence) if not sub_match: print("子串未在原句中匹配到") else: substr_start_idx = sub_match.start() # 2. 定位目标1在子串内的相对位置(加正向预查确保匹配的是后面带week的1,避免子串内有其他1的干扰) target_in_sub_idx = re.search(r"1(?=\s*week)", extracted_substr).start() # 3. 计算原句中的绝对位置 target_absolute_idx = substr_start_idx + target_in_sub_idx # 验证结果 print(f"目标1在原句中的索引位置:{target_absolute_idx}") print(f"验证:原句对应位置的字符是 {repr(original_sentence[target_absolute_idx])}")
简化写法(确认子串内仅存在一个目标1时可用)
如果确定提取的子串里只有一个1,可以不用正则,直接用字符串自带的find方法,代码更简洁:
original_sentence = "Take 1 tablet in the morning and at noon for 1 week" extracted_substr = "for 1 week" substr_start = original_sentence.find(extracted_substr) target_in_sub = extracted_substr.find("1") target_pos = substr_start + target_in_sub
内容的提问来源于stack exchange,提问作者Julia
相关产品推荐
相关产品推荐

