Python:第二次出现字符后拆分文本

DBS*_*DBS 17 python python-3.x

我需要在第二次出现" - "字符之前拆分文本.我现在所拥有的是产生不一致的结果.我尝试了各种rsplit和read through的组合,并在SO上尝试了其他解决方案,没有结果.

要拆分的示例文件名:some-sample-filename-to-split返回data.filename.在这种情况下,我只想'some-sample'回来.

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')
Run Code Online (Sandbox Code Playgroud)

JRo*_*ite 35

你可以这样做:

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

a.split("-", 2)将字符串分割到第二次出现-.

a.split("-", 2)[:2]将给出列表中的前2个元素.然后只需加入前两个元素.

要么

你可以使用正则表达式: ^([\w]+-[\w]+)

>>> import re
>>> reg = r'^([\w]+-[\w]+)'
>>> re.match(reg, a).group()
'some-sample'
Run Code Online (Sandbox Code Playgroud)

编辑:正如评论中所讨论的,这是您需要的:

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

>>> hyphen_split("some-sample-filename-to-split")
'some-sample'
>>> hyphen_split("some-sample")
'some'
Run Code Online (Sandbox Code Playgroud)


Nun*_*dré 7

在分隔符的第n次出现时,将字符串分成两半的通用形式为:

def split(strng, sep, pos):
    strng = strng.split(sep)
    return sep.join(strng[:pos]), sep.join(strng[pos:])
Run Code Online (Sandbox Code Playgroud)

如果pos为负,它将从字符串末尾开始计数。

>>> 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')
Run Code Online (Sandbox Code Playgroud)


Mik*_*ler 5

您可以使用str.index()

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

测试:

>>> hyphen_split("some-sample-filename-to-split")
'some-sample'
>>> hyphen_split("some-sample")
'some'
Run Code Online (Sandbox Code Playgroud)