无需迭代:如何获取Python字符串中字符右侧第二个出现的索引?
问题描述
给定Python字符串:
test = 'blablabla_foo_bar_baz'
需要获取字符_从右侧数第二个出现位置的索引(正索引或负索引均可,本例中正索引为13,负索引为-8),要求:
- 无需迭代,一次性完成操作
- 适配任意长度字符串与任意目标字符
- 最终目的是截取前缀(如
test[:-8])去除末尾的_bar_baz,因此直接获取该前缀的方案也可,但不能依赖待去除子串的已知长度 - 不采用两次调用
rfind的方案,希望使用re、rsplit等单次内置函数调用的方案
注:输入字符串至少包含两个目标字符,无需处理不存在的情况
解决方案
方法1:用rsplit直接获取前缀
利用rsplit指定分割次数为2,分割后取前两部分重新拼接,即可得到目标前缀:
test = 'blablabla_foo_bar_baz' target_char = '_' # 从右侧分割2次,取前两部分拼接成前缀 test_prefix = target_char.join(test.rsplit(target_char, 2)[:-1]) print(test_prefix) # 输出: blablabla_foo # 若需要正索引,直接取前缀长度即可 second_last_pos = len(test_prefix) print(second_last_pos) # 输出: 13 # 负索引通过前缀长度与原字符串长度计算 negative_pos = second_last_pos - len(test) print(negative_pos) # 输出: -8
方法2:用正则表达式匹配前缀
通过正则表达式匹配从字符串开头到倒数第二个目标字符的所有内容,直接提取前缀:
import re test = 'blablabla_foo_bar_baz' target_char = '_' # 转义目标字符,避免正则语法冲突(比如目标字符是.、*这类特殊符号时) escaped_char = re.escape(target_char) # 匹配开头到倒数第二个目标字符的完整前缀 match_result = re.search(rf'^(.*{escaped_char})[^{escaped_char}]*{escaped_char}', test) if match_result: test_prefix = match_result.group(1) print(test_prefix) # 输出: blablabla_foo second_last_pos = len(test_prefix) print(second_last_pos) # 输出: 13 negative_pos = second_last_pos - len(test) print(negative_pos) # 输出: -8
内容的提问来源于stack exchange,提问作者DeltaIV
相关产品推荐
相关产品推荐

