在给定分隔符第 n 次出现后,是否有一种 Python 方式来拆分字符串?
给定一个字符串:
'20_231_myString_234'
它应该被拆分为(在第二次出现后,分隔符为“_”):
['20_231', 'myString_234']
或者是完成此操作的唯一方法是计数、拆分和加入?
>>> n = 2
>>> groups = text.split('_')
>>> '_'.join(groups[:n]), '_'.join(groups[n:])
('20_231', 'myString_234')
似乎这是最易读的方式,替代方法是正则表达式)
用于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
我喜欢这个解决方案,因为它不需要任何实际的正则表达式就可以工作,并且可以很容易地适应另一个“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)
我想我会贡献我的两分钱。第二个参数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 倍。
我把我的测试脚本放到网上。欢迎您评论和评论。
>>>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']
这取决于您的拆分模式是什么。因为如果前两个元素总是数字,例如,您可以构建正则表达式并使用re
模块。它也可以拆分您的字符串。
我有一个更大的字符串来分割第 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!
@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']