Split string at nth occurrence of a given character

后端 未结 7 1927
攒了一身酷
攒了一身酷 2020-11-30 05:50

Is there a Python-way to split a string after the nth occurrence of a given delimiter?

Given a string:

\'20_231_myString_234\'

It s

相关标签:
7条回答
  • 2020-11-30 05:57

    Using re to get a regex of the form ^((?:[^_]*_){n-1}[^_]*)_(.*) where n is a variable:

    n=2
    s='20_231_myString_234'
    m=re.match(r'^((?:[^_]*_){%d}[^_]*)_(.*)' % (n-1), s)
    if m: print m.groups()
    

    or have a nice function:

    import re
    def nthofchar(s, c, n):
        regex=r'^((?:[^%c]*%c){%d}[^%c]*)%c(.*)' % (c,c,n-1,c,c)
        l = ()
        m = re.match(regex, s)
        if m: l = m.groups()
        return l
    
    s='20_231_myString_234'
    print nthofchar(s, '_', 2)
    

    Or without regexes, using iterative find:

    def nth_split(s, delim, n): 
        p, c = -1, 0
        while c < n:  
            p = s.index(delim, p + 1)
            c += 1
        return s[:p], s[p + 1:] 
    
    s1, s2 = nth_split('20_231_myString_234', '_', 2)
    print s1, ":", s2
    
    0 讨论(0)
  • 2020-11-30 06:09

    I like this solution because it works without any actuall regex and can easiely be adapted to another "nth" or delimiter.

    import re
    
    string = "20_231_myString_234"
    occur = 2  # on which occourence you want to split
    
    indices = [x.start() for x in re.finditer("_", string)]
    part1 = string[0:indices[occur-1]]
    part2 = string[indices[occur-1]+1:]
    
    print (part1, ' ', part2)
    
    0 讨论(0)
  • 2020-11-30 06:11
    >>> n = 2
    >>> groups = text.split('_')
    >>> '_'.join(groups[:n]), '_'.join(groups[n:])
    ('20_231', 'myString_234')
    

    Seems like this is the most readable way, the alternative is regex)

    0 讨论(0)
  • 2020-11-30 06:13
    >>>import re
    >>>str= '20_231_myString_234'
    
    >>> occerence = [m.start() for m in re.finditer('_',str)]  # this will give you a list of '_' position
    >>>occerence
    [2, 6, 15]
    >>>result = [str[:occerence[1]],str[occerence[1]+1:]] # [str[:6],str[7:]]
    >>>result
    ['20_231', 'myString_234']
    
    0 讨论(0)
  • 2020-11-30 06:17

    I had a larger string to split ever nth character, ended up with the following code:

    # Split every 6 spaces
    n = 6
    sep = ' '
    n_split_groups = []
    
    groups = err_str.split(sep)
    while len(groups):
        n_split_groups.append(sep.join(groups[:n]))
        groups = groups[n:]
    
    print n_split_groups
    

    Thanks @perreal!

    0 讨论(0)
  • 2020-11-30 06:18

    It depends what is your pattern for this split. Because if first two elements are always numbers for example, you may build regular expression and use re module. It is able to split your string as well.

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