Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从字符串中获取多个令牌的更好方法?(Python 2)_Python_String_Join_Split - Fatal编程技术网

从字符串中获取多个令牌的更好方法?(Python 2)

从字符串中获取多个令牌的更好方法?(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!'] 如果我想删除第一个令牌并保持其余令牌的完整

如果我有一个字符串:

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

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

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()
操作!时间上的观点很好。另外,请注意,在现实生活中,他可能会将行拆分一次(就像他在最顶端所做的那样),然后多次使用列表,在这种情况下,在所有用途中找到最大拆分次数的好处会更小,简化的成本会更高。