尝试将字符串拆分为数字7
,我希望7包含在拆分字符串的第二部分中。
代码:
a = 'cats can jump up to 7 times their tail length'
words = a.split("7")
print(words)
输出:
['cats can jump up to ', ' times their tail length']
字符串被拆分但第二部分不包括7。
我想知道如何包含7。
注意:不是Python split() without removing the delimiter的副本,因为分隔符必须是第二个字符串的一部分。
答案 0 :(得分:5)
一种简单而天真的方法就是找到你要拆分的索引并将其切片:
>>> a = 'cats can jump up to 7 times their tail length'
>>> ind = a.index('7')
>>> a[:ind], a[ind:]
('cats can jump up to ', '7 times their tail length')
答案 1 :(得分:4)
另一种方法是使用str.partition
:
a = 'cats can jump up to 7 times their tail length'
print(a.partition('7'))
# ('cats can jump up to ', '7', ' times their tail length')
要使用后一部分再次加入该号码,您可以使用str.join
:
x, *y = a.partition('7')
y = ''.join(y)
print((x, y))
# ('cats can jump up to ', '7 times their tail length')
或者手动完成:
sep = '7'
x = a.split(sep)
x[1] = sep + x[1]
print(tuple(x))
# ('cats can jump up to ', '7 times their tail length')
答案 2 :(得分:3)
在一行中,使用re.split
和其余字符串,并过滤re.split
离开的最后一个空字符串:
import re
a = 'cats can jump up to 7 times their tail length'
print([x for x in re.split("(7.*)",a) if x])
结果:
['cats can jump up to ', '7 times their tail length']
在分割正则表达式中使用()
告诉re.split
不要丢弃分隔符。一个(7)
正则表达式会起作用,但会创建一个像str.partition
那样的3项目列表,并且需要一些后期处理,所以没有一个单行。
现在如果数字未知,正则表达式(再次)是最好的方法。只需将代码更改为:
[x for x in re.split("(\d.*)",a) if x]
答案 3 :(得分:0)
re也可用于全局捕获:
>>> s = 'The 7 quick brown foxes jumped 7 times over 7 lazy dogs'
>>> sep = '7'
>>>
>>> [i for i in re.split(f'({sep}[^{sep}]*)', s) if i]
['The ', '7 quick brown foxes jumped ', '7 times over ', '7 lazy dogs']
如果f-string难以阅读,请注意它只是评估为(7[^7]*)
(与listcomp相同,可以使用list(filter(bool, ...))
,但它相当丑陋)
在Python 3.7及更高版本中,re.split()
允许拆分零宽度模式。这意味着可以使用前瞻性正则表达式,即f'(?={sep})'
,而不是上面显示的组。
这有什么奇怪的时间:如果使用re.split()
(即没有编译的模式对象),组解决方案的运行速度始终比前瞻快1.5倍。然而,在编译时,前瞻性击败了另一方面:
In [4]: r_lookahead = re.compile('f(?={sep})')
In [5]: r_group = re.compile(f'({sep}[^{sep}]*)')
In [6]: %timeit [i for i in r_lookahead.split(s) if i]
2.76 µs ± 207 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [7]: %timeit [i for i in r_group.split(s) if i]
5.74 µs ± 65.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [8]: %timeit [i for i in r_lookahead.split(s * 512) if i]
137 µs ± 1.93 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [9]: %timeit [i for i in r_group.split(s * 512) if i]
1.88 ms ± 18.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
递归解决方案也可以正常工作,虽然比在已编译的正则表达式上拆分更慢(但比直接re.split(...)
更快):
def splitkeep(s, sep, prefix=''):
start, delim, end = s.partition(sep)
return [prefix + start, *(end and splitkeep(end, sep, delim))]
>>> s = 'The 7 quick brown foxes jumped 7 times over 7 lazy dogs'
>>>
>>> splitkeep(s, '7')
['The ', '7 quick brown foxes jumped ', '7 times over ', '7 lazy dogs']
答案 4 :(得分:0)
使用枚举, 这只适用于字符串不以分隔符开头的情况
s = 'The quick 7 the brown foxes jumped 7 times over 7 lazy dogs'
separator = '7'
splitted = s.split(separator)
res = [((separator if i > 0 else '') + item).strip() for i, item in enumerate(splitted)]
print(res)
['The quick', '7 the brown foxes jumped', '7 times over', '7 lazy dogs']
[Program finished]
答案 5 :(得分:0)
还可以使用 new Date(2021, 2, 1).toISOString() // 2021-02-28T22:00:00.000Z
和列表推导来完成所有这些工作,而无需导入任何库。但是,这会使您的代码稍微“不那么漂亮”:
split
这样,a = 'cats can jump up to 7 times their tail length'
sep = '7'
splitString = a.split(sep)
splitString = list(splitString[0]) + [sep+x for x in splitString[1:]]
将携带值:
splitString