Split text after the second occurrence of character

Question:

I need to split text before the second occurrence of the ‘-‘ character. What I have now is producing inconsistent results. I’ve tried various combinations of rsplit and read through and tried other solutions on SO, with no results.

Sample file name to split: 'some-sample-filename-to-split' returned in data.filename. In this case, I would only like to have 'some-sample' returned.

fname, extname = os.path.splitext(data.filename)
file_label = fname.rsplit('/',1)[-1]
file_label2 = file_label.rsplit('-',maxsplit=3)
print(file_label2,'n','---------------','n')
Asked By: DBS

||

Answers:

You can do something like this:

>>> a = "some-sample-filename-to-split"
>>> "-".join(a.split("-", 2)[:2])
'some-sample'

a.split("-", 2) will split the string upto the second occurrence of -.

a.split("-", 2)[:2] will give the first 2 elements in the list. Then simply join the first 2 elements.

OR

You could use regular expression : ^([w]+-[w]+)

>>> import re
>>> reg = r'^([w]+-[w]+)'
>>> re.match(reg, a).group()
'some-sample'

EDIT: As discussed in the comments, here is what you need:

def hyphen_split(a):
    if a.count("-") == 1:
        return a.split("-")[0]
    return "-".join(a.split("-", 2)[:2])

>>> hyphen_split("some-sample-filename-to-split")
'some-sample'
>>> hyphen_split("some-sample")
'some'
Answered By: JRodDynamite

You could use regular expressions:

import re

file_label = re.search('(.*?-.*?)-', fname).group(1)
Answered By: Christian

You can use str.index():

def hyphen_split(s):
    pos = s.index('-')
    try:
        return s[:s.index('-', pos + 1)]
    except ValueError:
        return s[:pos]

test:

>>> hyphen_split("some-sample-filename-to-split")
'some-sample'
>>> hyphen_split("some-sample")
'some'
Answered By: Mike Müller

A generic form to split a string into halves on the nth occurence of the separator would be:

def split(strng, sep, pos):
    strng = strng.split(sep)
    return sep.join(strng[:pos]), sep.join(strng[pos:])

If pos is negative it will count the occurrences from the end of string.

>>> strng = 'some-sample-filename-to-split'
>>> split(strng, '-', 3)
('some-sample-filename', 'to-split')
>>> split(strng, '-', -4)
('some', 'sample-filename-to-split')
>>> split(strng, '-', 1000)
('some-sample-filename-to-split', '')
>>> split(strng, '-', -1000)
('', 'some-sample-filename-to-split')
Answered By: Nuno André

When proceeding with the dataframe and the split needed
for the entire column values, lambda function is better than regex.

df['column_name'].apply(lambda x: "-".join(x.split('-',2)[:2]))

Here’s a somewhat cryptic implementation avoiding the use of join():

def split(string, sep, n):
    """Split `stringĀ“ at the `n`th occurrence of `sep`"""
    pos = reduce(lambda x, _: string.index(sep, x + 1), range(n + 1), -1)
    return string[:pos], string[pos + len(sep):]
Answered By: Brecht Machiels
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.