繁体   English   中英

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

[英]Split text after the second occurrence of character

我需要在第二次出现“-”字符之前拆分文本。 我现在所拥有的是产生不一致的结果。 我尝试了rsplit的各种组合并通读并尝试了其他解决方案,但没有结果。

要拆分的示例文件名:在data.filename中返回'some-sample-filename-to-split' 在这种情况下,我只想返回'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')

你可以这样做:

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

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

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

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

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

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

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'

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

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

如果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')

您可以使用str.index()

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

测试:

>>> hyphen_split("some-sample-filename-to-split")
'some-sample'
>>> hyphen_split("some-sample")
'some'

您可以使用正则表达式:

import re

file_label = re.search('(.*?-.*?)-', fname).group(1)

在处理数据帧和整个列值所需的拆分时,lambda 函数比正则表达式更好。

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

这是一个有点神秘的实现,避免使用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):]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM