48

在给定分隔符第 n 次出现后,是否有一种 Python 方式来拆分字符串?

给定一个字符串:

'20_231_myString_234'

它应该被拆分为(在第二次出现后,分隔符为“_”):

['20_231', 'myString_234']

或者是完成此操作的唯一方法是计数、拆分和加入?

4

8 回答 8

71
>>> n = 2
>>> groups = text.split('_')
>>> '_'.join(groups[:n]), '_'.join(groups[n:])
('20_231', 'myString_234')

似乎这是最易读的方式,替代方法是正则表达式)

于 2013-06-12T07:57:05.830 回答
8

用于re获取形式为变量^((?:[^_]*_){n-1}[^_]*)_(.*)的正则表达式:n

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

或者有一个很好的功能:

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)

或者没有正则表达式,使用迭代查找:

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
于 2013-06-12T07:40:38.043 回答
5

我喜欢这个解决方案,因为它不需要任何实际的正则表达式就可以工作,并且可以很容易地适应另一个“nth”或分隔符。

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)
于 2013-06-12T07:54:47.260 回答
4

我想我会贡献我的两分钱。第二个参数split()允许您在一定数量的字符串之后限制拆分:

def split_at(s, delim, n):
    r = s.split(delim, n)[n]
    return s[:-len(r)-len(delim)], r

在我的机器上,@perreal 的两个很好的答案,迭代查找和正则表达式,实际上分别比这种方法慢 1.4 和 1.6 倍。

值得注意的是,如果您不需要初始位,它可以变得更快。那么代码就变成了:

def remove_head_parts(s, delim, n):
    return s.split(delim, n)[n]

我承认,对命名不太确定,但它确实有效。有点令人惊讶的是,它比迭代查找快 2 倍,比正则表达式快 3 倍。

我把我的测试脚本放到网上。欢迎您评论和评论。

于 2017-05-12T17:31:58.130 回答
0
>>>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']
于 2013-06-12T08:23:06.553 回答
0

这取决于您的拆分模式是什么。因为如果前两个元素总是数字,例如,您可以构建正则表达式并使用re模块。它也可以拆分您的字符串。

于 2013-06-12T07:41:16.200 回答
0

我有一个更大的字符串来分割第 n 个字符,最后得到以下代码:

# 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

谢谢@perreal!

于 2015-04-23T11:07:10.000 回答
0

@AllBlackt 解决方案的函数形式

def split_nth(s, sep, n):
    n_split_groups = []
    groups = s.split(sep)
    while len(groups):
          n_split_groups.append(sep.join(groups[:n]))
          groups = groups[n:]
    return n_split_groups

s = "aaaaa bbbbb ccccc ddddd eeeeeee ffffffff"
print (split_nth(s, " ", 2))

['aaaaa bbbbb', 'ccccc ddddd', 'eeeeeee ffffffff']
于 2021-08-26T07:32:01.847 回答