Remove Last instance of a character and rest of a string

后端 未结 4 940
予麋鹿
予麋鹿 2020-12-10 14:41

If I have a string as follows:

foo_bar_one_two_three

Is there a clean way, with RegEx, to return: foo_bar_one_two?

I know I

相关标签:
4条回答
  • 2020-12-10 15:19

    One way is to use rfind to get the index of the last _ character and then slice the string to extract the characters up to that point:

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

    You need to check that the rfind call returns something greater than -1 before using it to get the substring otherwise it'll strip off the last character.

    If you must use regular expressions (and I tend to prefer non-regex solutions for simple cases like this), you can do it thus:

    >>> import re
    >>> s = "foo_bar_one_two_three"
    >>> re.sub('_[^_]*$','',s)
    'foo_bar_one_two'
    
    0 讨论(0)
  • 2020-12-10 15:24
    result = my_string.rsplit('_', 1)[0]
    

    Which behaves like this:

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

    See in the documentation entry for str.rsplit([sep[, maxsplit]]).

    0 讨论(0)
  • 2020-12-10 15:37

    I know is python, and my answer may be a little bit wrong in syntax, but in java you would do:

    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"
    

    Hope in python split function works same way. :)

    EDIT:

    Using the limit part of the function you can do:

    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]
    
    0 讨论(0)
  • 2020-12-10 15:44

    Similar the the rsplit solution, rpartition will also work:

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

    You'll need to watch out for the case where the separator character is not found. In that case the original string will be in index 2, not 0.

    doc string:

    rpartition(...)

    S.rpartition(sep) -> (head, sep, tail)

    Search for the separator sep in S, starting at the end of S, and return the part before it, the separator itself, and the part after it. If the separator is not found, return two empty strings and S.

    0 讨论(0)
提交回复
热议问题