从字符串中获取多个标记的更好方法是什么? (Python 2)

时间:2013-06-24 23:16:04

标签: python string join split

如果我有一个字符串:

“快速的棕色狐狸跳过懒狗!”

我经常使用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!"

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

2 个答案:

答案 0 :(得分: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])

答案 1 :(得分: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