我有一个Python字符串:

test = 'blablabla_foo_bar_baz'

我想要_的第二次出现的负指数from the right:在这种情况下,这将是-8,但即使是正指数13也是一个可以接受的答案,因为从正指数计算负指数并不困难.我怎么能做到这一点?GPT-4解决方案使用rfind+迭代,但我想知道是否有可能在没有迭代的情况下一次解决它.当然,答案应该处理任意长度的字符串,并且应该匹配任意字符(在本例中为_).

编辑:我需要_右边第二次出现的负指数,因为我想go 掉_bar_baz,这可以很容易地完成

test_prefix = test[:-8]

因此,替代的解决方案,允许我得到test_prefix,而不是首先从_的右侧找到第二次出现的负指数,也是可以的.使用子字符串_bar_baz的长度(在本例中为8)是可以的,因为我不知道此子字符串的长度.相反,计算从_开始的第二次出现的子字符串的长度,直到字符串的末尾,就可以了.不过,这看起来和计算_右边第二次出现的负指数没有什么不同.

EDIT2:一位 comments 者说,没有迭代是不可能解决这个问题的.我不确定他们是正确的,但我会展示一个(GPT-4生成的)我don't想要的例子:

def find_second_last_occurrence(text, char='_'):
    last_occurrence = text.rfind(char)

    second_last_occurrence = text.rfind(char, 0, last_occurrence)

    return second_last_occurrence

string = "blablabla_foo_bar_baz"
result = find_second_last_occurrence(string, '_')

print(result)  # Output: 20

在这种情况下,我们不得不两次拨打rfind.这真的有必要吗?我不认为所有可能的解决方案(包括基于rersplit等的解决方案)都需要调用内置函数两次.我没有在字符串中包括任何判断_出现的代码,因为我确定我的输入字符串包含至少两个_出现.

推荐答案

我不确定想要的确切解决方案,但如果目标只是拆分字符串,那么还有一种更简洁的方法,它也可以给你提供它被削减的指数.

test = 'blablabla_foo_bar_baz'
result, *_ = test.rsplit('_', maxsplit=2) # split from the right two times
print(result) # blablabla_foo
print(len(result)) # 13 which is the index it was cut off at
print(len(test) - len(result)) # 8 i.e. the negative index

Python相关问答推荐

如何使用Google Gemini API为单个提示生成多个响应?

通过优化空间在Python中的饼图中添加标签

将特定列信息移动到当前行下的新行

max_of_three使用First_select、second_select、

在线条上绘制表面

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

"使用odbc_connect(raw)连接字符串登录失败;可用于pyodbc"

Python Pandas获取层次路径直到顶层管理

判断solve_ivp中的事件

为什么常规操作不以其就地对应操作为基础?

(Python/Pandas)基于列中非缺失值的子集DataFrame

BeautifulSoup-Screper有时运行得很好,很健壮--但有时它失败了::可能这里需要一些更多的异常处理?

当HTTP 201响应包含 Big Data 的POST请求时,应该是什么?  

获取git修订版中每个文件的最后修改时间的最有效方法是什么?

如何获得满足掩码条件的第一行的索引?

操作布尔值的Series时出现索引问题

与同步和异步客户端兼容的Python函数

Pandas:使列中的列表大小与另一列中的列表大小相同

如何在基于时间的数据帧中添加计算值

Python:在cmd中添加参数时的语法