1

如果我有一个字符串:

“敏捷的棕色狐狸跳过了懒狗!”

我会经常使用 split() 函数来标记字符串。

testString = "The quick brown fox jumps over the lazy dog!"
testTokens = testString.split(" ")

这会给我一个清单:

['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog!']

如果我想删除第一个令牌并保持令牌的 REST 完整,我将执行以下操作以使其成为单线:

newString = " ".join(testTokens.split(' ')[1:]) # "quick brown fox jumps over the lazy dog!"

或者,如果我想要某个范围:

newString = " ".join(testTokens.split(' ')[2:4]) # "brown fox"
newString = " ".join(testTokens.split(' ')[:3]) # "The quick brown"

当然,我可能想拆分除空格以外的其他内容:

testString = "So.long.and.thanks.for.all.the.fish!"
testTokens = testString.split('.')

newString = ".".join(testTokens.split('.')[3:]) # "thanks.for.all.the.fish!"

这是实现这一目标的最佳方法吗?还是有更有效或更易读的方式?

4

2 回答 2

2

请注意,split可以采用可选的第二个参数,表示应该进行的最大拆分数:

>>> testString.split(' ', 1)[1]
'quick brown fox jumps over the lazy dog!'

这比" ".join(testTokens.split(' ')[1:]), 每当它可以应用时要好得多。

感谢@abarnert 指出.split(' ', 1)[1]如果没有空格会引发异常。看看partition会不会有问题。


此外,还有一种rsplit方法,因此您可以使用:

>>> testString.rsplit(' ', 6)[0]
'The quick brown'

而不是" ".join(testTokens.split(' ')[:3]).

于 2013-06-24T23:19:17.777 回答
1

您当前的方法非常好。通过限制拆分数量,您可以获得非常轻微的性能提升。例如:

>>> ' '.join(testString.split(' ', 4)[2:4])
'brown fox'
>>> ' '.join(testString.split(' ', 3)[:3])
'The quick brown'
>>> ' '.join(testString.split(' ', 1)[1:])
'quick brown fox jumps over the lazy dog!'

请注意,对于较小的字符串,差异可以忽略不计,因此您可能应该坚持使用更简单的代码。以下是最小时序差异的示例:

In [2]: %timeit ' '.join(testString.split(' ', 4)[2:4])
1000000 loops, best of 3: 752 ns per loop

In [3]: %timeit ' '.join(testString.split(' ')[2:4])
1000000 loops, best of 3: 886 ns per loop
于 2013-06-24T23:22:16.833 回答