从字符串中获取多个令牌的更好方法?(Python 2)
如果我有一个字符串: “敏捷的棕色狐狸跳过了懒狗!” 我将经常使用split()函数来标记字符串从字符串中获取多个令牌的更好方法?(Python 2),python,string,join,split,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!'] 如果我想删除第一个令牌并保持其余令牌的完整
testString = "The quick brown fox jumps over the lazy dog!"
testTokens = testString.split(" ")
这将给我一个列表:
['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog!']
如果我想删除第一个令牌并保持其余令牌的完整性,我将执行以下操作使其成为一行:
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!"
这是实现这一目标的最佳方式吗?或者有更有效或更可读的方法吗?注意,可以采用可选的第二个参数,表示应进行的最大拆分数:
>>> testString.split(' ', 1)[1]
'quick brown fox jumps over the lazy dog!'
这比“”.join(testTokens.split(“”)[1:])
好得多,只要可以应用它
感谢@abarnert指出.split(“”,1)[1]
在没有空格的情况下引发异常。看看这是否构成了一个问题
此外,还有一种方法,因此您可以使用:
>>> testString.rsplit(' ', 6)[0]
'The quick brown'
而不是
“”.join(testTokens.split(“”)[:3])
您当前的方法非常好。通过限制拆分的数量,可以获得非常轻微的性能提升。例如:
>>> ' '.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
我觉得这个不错。您的问题到底是什么?我认为您不希望在第一个示例之后的所有示例中使用
testTokens.split(“”)
testTokens
已经是testString.split(“”
),所以您只想按原样使用它。如果您在空间上进行拆分,为什么不使用testString.split()
?它将把连续的空格作为一个单独的空格来处理(尽管我想您可能希望保留连续的空格)。.split(“”,1)[1]
的唯一问题是,如果没有空格,它会引发异常;如果这是一个问题,您可以使用.partition(“”)[-1]
。@abarnert谢谢,我用rsplit
将其添加到了answerNice中。我不确定这是一个绝对最好的例子,但我相信OP可以从你的解释和链接中找出它的作用和用途。这很好用-不知道第二个论点。它适用于我正在使用的大多数情况,并为我保存了join()
操作!时间上的观点很好。另外,请注意,在现实生活中,他可能会将行拆分一次(就像他在最顶端所做的那样),然后多次使用列表,在这种情况下,在所有用途中找到最大拆分次数的好处会更小,简化的成本会更高。