【问题标题】:Better way to get multiple tokens from a string? (Python 2)从字符串中获取多个标记的更好方法? (Python 2)
【发布时间】:2013-06-24 23:16:03
【问题描述】:

如果我有一个字符串:

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

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

这是完成此任务的最佳方法吗?或者有没有更高效或者更易读的方式?

【问题讨论】:

  • 这对我来说很好。你的问题到底是什么?
  • 我认为您在第一个示例之后的所有示例中都不需要testTokens.split(' ')testTokens 已经是 testString.split(" "),所以你只想按原样使用它。
  • 如果你在空间上分割,为什么不使用testString.split()呢?它会将连续的空格作为一个单独的空格处理(尽管我想您可能希望保留连续的空格)。

标签: python string join split


【解决方案1】:

请注意,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])

【讨论】:

  • .split(' ', 1)[1] 的唯一问题是如果没有空格会引发异常;如果有问题,您可以使用.partition(' ')[-1]
  • @abarnert 谢谢,我将其添加到答案中
  • rsplit 很好的补充。我不确定这是绝对最好的例子,但我相信 OP 可以从你的解释和链接中弄清楚它的作用以及他会在哪里使用它。
  • 这很好用——不知道第二个参数。它适用于我使用的大多数情况,并为我节省了 join() 操作!
【解决方案2】:

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

>>> ' '.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

【讨论】:

  • 关于时机的好点。另外,请注意,在现实生活中,他可能会拆分线路一次(就像他在最顶部所做的那样),然后多次使用列表,在这种情况下,找到所有拆分的最大数量的好处他的用途会更小,而简单的成本会更高。
猜你喜欢
  • 1970-01-01
  • 2020-02-20
  • 2015-09-25
  • 2016-12-02
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
相关资源
最近更新 更多