在第n次给定分隔符出现后,是否有Python方法分割字符串?
给出一个字符串:
'20_231_myString_234'
应将其拆分为(在第二次出现后,分隔符为'_'):
['20_231', 'myString_234']
或者是计算,分割和加入的唯一方法吗?
答案 0 :(得分:57)
>>> n = 2
>>> groups = text.split('_')
>>> '_'.join(groups[:n]), '_'.join(groups[n:])
('20_231', 'myString_234')
似乎这是最可读的方式,替代方案是正则表达式)
答案 1 :(得分:7)
使用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
答案 2 :(得分:5)
我喜欢这个解决方案,因为它没有任何实际的正则表达式,可以很容易地适应另一个“第n”或分隔符。
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)
答案 3 :(得分:2)
我以为我会贡献两分钱。 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倍。
我提出了my testing script online。欢迎您查看和评论。
答案 4 :(得分:0)
这取决于此分割的模式。例如,如果前两个元素总是数字,则可以构建正则表达式并使用re
模块。它也可以分割你的字符串。
答案 5 :(得分: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']
答案 6 :(得分: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!