使用正则表达式按顺序匹配文本中的指定单词并获取其索引位置
解决按顺序查找单词并获取原字符串索引的问题
你的思路完全没问题——按顺序逐个查找单词,每次从上一个单词的末尾位置开始继续搜索,但现有代码的核心问题是:re.search返回的span()结果是相对于你截取的子串t[j:]的索引,并非原字符串的绝对位置,直接存储这个值自然得不到预期的结果。
问题具体分析
举个例子:
- 第一次搜索
Billy时,t[j:]就是原字符串,得到的(0,5)是正确的原字符串索引; - 但第二次搜索
Willy时,t[j:]变成了' and Willy and Billy and someone',此时找到的Willy的span是(5,10)(仅相对于这个子串),你直接把这个值存入indexes并更新j为10,这就完全偏离了原字符串的真实位置。
正确实现代码
我们只需要把每个匹配到的相对位置转换成原字符串的绝对位置即可,同时加入re.escape避免单词中的正则元字符干扰匹配:
import re t = 'Billy and Willy and Billy and someone' words = ['Billy', 'Willy', 'Billy'] indexes = [] current_pos = 0 # 记录当前在原字符串中的起始搜索位置 for word in words: # 用re.escape处理单词,避免正则元字符引发的意外匹配 match = re.search(re.escape(word), t[current_pos:]) if match: # 将子串中的相对索引转换为原字符串的绝对索引 start = current_pos + match.start() end = current_pos + match.end() indexes.append((start, end)) # 更新下一次搜索的起始位置为当前匹配的末尾 current_pos = end else: # 若未找到目标单词,可根据需求自定义处理逻辑,比如添加None或抛出异常 indexes.append(None) print(indexes) # 输出结果: [(0, 5), (10, 15), (20, 25)]
结果验证
运行这段代码后,indexes中的结果完全符合你的预期:
- 第一个
Billy对应原字符串索引(0,5) Willy对应原字符串索引(10,15)- 第二个
Billy对应原字符串索引(20,25)
内容的提问来源于stack exchange,提问作者hidden layer
相关产品推荐
相关产品推荐

