Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.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中拆分此字符串_Python_Regex - Fatal编程技术网

如何在python中拆分此字符串

如何在python中拆分此字符串,python,regex,Python,Regex,我正在学习Python(3)。我想把每一行分成四部分 [Test Branch] bobjones 0 6/13/2008 4:24 PM [Todd's Workspace] tfatcher 0 6/16/2008 9:20 AM [Henry] hmckinkley 1 6/17/2008 10:12 AM [Henry]

我正在学习Python(3)。我想把每一行分成四部分

[Test Branch]             bobjones       0         6/13/2008 4:24 PM
[Todd's Workspace]        tfatcher       0         6/16/2008 9:20 AM
[Henry]                   hmckinkley     1         6/17/2008 10:12 AM
[Henry]                   hmckinkley     0         6/17/2008 10:15 AM
我可以对每一个都调用line.split(),但之后我会将日期重新组合起来。我猜第一节中的空格也排除了这一点。我想我可以切片,但我不能100%确定这些数据的宽度是否像它看起来那样固定。正则表达式可能是最好的,嗯?有什么建议吗

更新: 我认为@Selcuk的解决方案会非常有效:

branch,user,version,timestamp = [commitheaderline.split("]", 1)[0] + "]"] + commitheaderline.split("]", 1)[1].split(None, 2)
但是后来我遇到了一些用户名太长的数据(下面的例子),所以剩下的数据都被放在了新行上。所以我现在正在努力。我在想,在运行split()之前,我会以某种方式对该行进行测试,如果它看起来不是一个“正确”的行,我会将其与下一行连接起来

[Test Branch]             bobjones       0         6/13/2008 4:24 PM
[Todd's Workspace]        tfatcher       0         6/16/2008 9:20 AM
[cole]                    bob.darknsdale
                                         0        7/27/2012 12:49 PM

您可以执行以下操作:

[line.split("]", 1)[0] + "]"] + line.split("]", 1)[1].split(None, 2)
这将导致

['[Test Branch]', 'bobjones', '0', '6/13/2008 4:24 PM']
试一试

如果字符串被多个空格分隔,这将起作用。如果它们是选项卡描述的,请尝试

import re
sep = re.split("\t+", str)

这将适用于任何大小的空格或制表符。

您自己尝试过的任何内容?简单地说:
line.split(None,4)
@TigerhawkT3这也将拆分
“[Test”
“Branch]”
@Selcuk-很好。重新打开。@TigerhawkT3它是SCM(环绕)的输出,它是人类可读的,这就是为什么它不是CSV,但是我需要解析它并加载到Git中。如果@TigerhawkT3评论的值和列值之间只有一个空格,那么这将失败。也许OP应该详细说明他/她正在处理的细节。可以用
\s
re.split(“\s{2,}”,str)
替换空格,然后它将处理两个空格/tabI认为这会很好,但如果“Todd的工作区”中有两个空格,它最终会将其拆分。你能依赖什么样的描述?日期和括号内的字段中是否有多个空格?如果字段太长,会发生什么?我们需要一些角落案例的示例。我得到一个索引超出范围错误
commitdetails=[part.split(“]”,1)[0]+“]”]+part.split(“]”,1)[1]。split(None,2)
。可能是因为我还有一些其他的数据行通过这个程序运行(我暂时忽略它们)是的,当我去掉多余的行时,它是有效的。Arg我发现了一个问题,我遇到了一些我没有预料到的数据。我将更新我的问题。您应该运行一些预处理,以消除第一个字段中的额外空格等内容。您的数据似乎需要进行清理才能正确解析。
import re
sep = re.split("\t+", str)
In [4]: import re

In [5]: print text

[Test Branch]             bobjones       0         6/13/2008 4:24 PM
[Todd's Workspace]        tfatcher       0         6/16/2008 9:20 AM
[Henry]                   hmckinkley     1         6/17/2008 10:12 AM
[Henry]                   hmckinkley     0         6/17/2008 10:15 AM


In [6]: pattern = re.compile(r'(\[.*?\])\s+(\w+)\s+(\d+)\s+(.*?$)', re.M)


In [7]: for match in pattern.finditer(text):
   ...:     #do whatever you want here. cols are grouped
   ...:     print "first col: %s - 4th col: %s" %(match.group(1), match.group(4))
   ...:
   ...:
first col: [Test Branch] - 4th col: 6/13/2008 4:24 PM
first col: [Todd's Workspace] - 4th col: 6/16/2008 9:20 AM
first col: [Henry] - 4th col: 6/17/2008 10:12 AM
first col: [Henry] - 4th col: 6/17/2008 10:15 AM