删除最后一个字符及其后面的字符串

13
如果我有一个字符串如下: < p> foo_bar_one_two_three 有没有一种干净的方式,使用正则表达式返回:foo_bar_one_two
我知道可以使用split,pop和join来解决此问题,但我正在寻找一种更简洁的解决方案。

我不懂Python,但在sed中它是s/_[^_]*$// - Beta
你可以像@Beta所说的那样使用re模块:re.sub(r'_[^_]*$', '', 'foo_bar_one_two_three')。但我建议使用@Tadeck的答案。 - zaquest
5个回答

29
result = my_string.rsplit('_', 1)[0]

它的表现形式如下:

>>> my_string = 'foo_bar_one_two_three'
>>> print(my_string.rsplit('_', 1)[0])
foo_bar_one_two

请查看文档中有关str.rsplit([sep[, maxsplit]])的条目。


3

一种方法是使用 rfind 获取最后一个 _ 字符的索引,然后切片字符串以提取该点之前的字符:

>>> s = "foo_bar_one_two_three"
>>> idx = s.rfind("_")
>>> if idx >= 0:
...     s = s[:idx]
...
>>> print s
foo_bar_one_two

在使用rfind获取子字符串之前,您需要检查其返回值是否大于-1,否则它会删掉最后一个字符。

如果你必须使用正则表达式(对于像这样的简单情况,我倾向于使用非正则表达式的解决方案),你可以这样做:

>>> import re
>>> s = "foo_bar_one_two_three"
>>> re.sub('_[^_]*$','',s)
'foo_bar_one_two'

3

rsplit 解决方案类似,rpartition 也可以使用:

result = my_string.rpartition("_")[0]

需要注意分隔符未找到的情况。在这种情况下,原始字符串将位于索引2而不是0。

文档字符串:

rpartition(...)

S.rpartition(sep) -> (头部, 分隔符, 尾部)

从S的末尾开始搜索分隔符sep,并返回其前面的部分、分隔符本身和其后面的部分。如果未找到分隔符,则返回两个空字符串和S。


1
这是一个用于删除最后一个指定字符串之后所有内容的通用函数。为了额外加分,它还支持删除第n个最后出现的指定字符串之后的所有内容。
def removeEverythingAfterLast (needle, haystack, n=1):
    while n > 0:
        idx = haystack.rfind(needle)
        if idx >= 0:
            haystack = haystack[:idx]
            n -= 1
        else:
            break
    return haystack

在您的情况下,要删除最后一个“_”之后的所有内容,您只需要这样调用它:
updatedString = removeEverythingAfterLast('_', yourString)

如果你想删除倒数第二个下划线后的所有内容,可以这样调用它:
updatedString = removeEverythingAfterLast('_', yourString, 2)

0

我知道这是Python,我的答案可能在语法上有点错误,但在Java中你会这样做:

String a = "foo_bar_one_two_three";
String[] b = a.split("_");
String c = "";
for(int i=0; i<b.length-1; a++){
    c += b[i];
    if(i != b.length-2){
        c += "_";
    }
}
//and at this point, c is "foo_bar_one_two"

希望在Python中,split函数的工作方式相同。 :)

编辑:

使用函数的限制部分,可以执行以下操作:

String a = "foo_bar_one_two_three";
String[] b = a.split("_",StringUtils.countMatches(a,"_"));
//and at this point, b is the array = [foo,bar,one,two]

1
Python更加简洁。你所做的基本上就像'_'.join(a.split('_')[:-1])一样。我认为你所采取的步骤与执行的几乎30个字符长的示例完全相同。 - Tadeck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接