如何在python中拆分此字符串
我正在学习Python(3)。我想把每一行分成四部分如何在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]
[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