【问题标题】:Problem with string manipulation in pythonpython中字符串操作的问题
【发布时间】:2020-08-31 00:45:28
【问题描述】:

我一直致力于 WhatsApp Chat 的 python 数据可视化项目。我有一个这样的字符串。

line = '[14/11/18, 2:47:26 PM] Chaitanya: Yeah, Lets go to the movies to night'

我想把它分解成这样。

['[14/11/18, 2:47:26 PM]', 'Chaitanya: Yeah, Lets go to the movies to night']

我尝试过使用split() 函数,但我似乎无法得到完全相同的东西。此外,第一次字段会有所不同,因此该字段的长度可能每次都不相同。

我会得到一些帮助。谢谢。

【问题讨论】:

  • 也许是[line[:line.index(']')+1], line[line.index(']')+2:]]

标签: python python-3.x string datetime


【解决方案1】:

试试这个:

r = line.split(']', 1)
r[0] += ']'

【讨论】:

  • 另外,如果消息包含任何 ']' 那么这也可能会失败。
  • @ghostshelltaken 它将在第一次出现时分裂
【解决方案2】:
line = '[14/11/18, 2:47:26 PM] Chaitanya: Yeah, Lets go to the movies to night'
reslist =line.split(']',1)
reslist[0] += "]" # needed because split removes delimiter
reslist[1] = reslist[1].lstrip()
print(reslist) # ['[14/11/18, 2:47:26 PM]', 'Chaitanya: Yeah, Lets go to the movies to night']

【讨论】:

  • 如果消息包含任何 ']' 则失败。
【解决方案3】:

Find 第一次出现] 并将其用于slicing

[line[:line.find(']')+1],line[line.find(']')+2:]]

顺便说一句:对查找结果使用辅助变量应该会更快,这在您使用 DataViz 时可能会更好:

f=line.find(']')
[line[:f+1],line[f+2:]]

timeit 的结果:

>>> import timeit
>>> timeit.timeit("line = '[14/11/18, 11:47:26 PM] Chaitanya: Yeah, Lets go to the movies [to] night'; [line[:line.find(']')+1],line[line.find(']')+2:]]")
0.33965302700016764
>>> timeit.timeit("line = '[14/11/18, 11:47:26 PM] Chaitanya: Yeah, Lets go to the movies [to] night'; f=line.find(']'); [line[:f+1],line[f+2:]]")
0.21619235799971648

【讨论】:

  • 是的,这是完美的。谢谢
【解决方案4】:
import re
re.split(r'(?<=\])\s', line, 1)
['[14/11/18, 2:47:26 PM]', 'Chaitanya: Yeah, Lets go to the movies to night']

如果前面有括号,它会在空白处拆分,并且只拆分一次。

  • \s 匹配任何空格
  • (?&lt;=\])是后面找](记为\]

【讨论】:

  • 感谢这项工作,如果你能说明这是如何工作的,我将不胜感激,因为我不熟悉 import re
  • @ghostshelltaken 我做了一个简短的解释并缩短了正则表达式。也许它有点帮助
  • 这有帮助,谢谢。我也会调查re
【解决方案5】:

我想我们理所当然地认为日期的格式是一个常数,因此我们的最大长度为 22。

line = '[14/11/18, 2:47:26 PM] Chaitanya: Yeah, Lets go to the movies to night'
loc = line.find(']',0,22)   # find its location => 21 

our_result = [
    line[0:loc+1], line[loc+2:]
]

【讨论】:

  • 日期格式不固定:[14/11/18, 2:47:26 PM][14/11/18, 10:47:26 PM]
  • 当我说恒定时,我的意思是长度不会大于 22
  • 是的,但是当时间大于9时你的代码不起作用:find会返回-1,试试吧。您必须将 find 的 end 参数设置为 23 或完全删除 start 和 end 参数,因为 find 将返回第一个匹配项。
  • 只需添加一个简单的 if 来检查它: if loc == -1: loc = line.find(']',0,23)
猜你喜欢
  • 2021-07-17
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
相关资源
最近更新 更多