重复拆分数字和字符串

时间:2014-01-14 03:15:39

标签: python regex

我有以下字符串:

s = index ( 1.0000000e+00 2.0000000e+00 3.0000000e+00)  _x_ ( error error error ) t ( 1.2500000e+02 1.2500000e+02 1.2500000e+02 ) 

我需要将其拆分为如下列表:

['index', '1.0000000e+00 2.0000000e+00 3.0000000e+00', 
'_x_', 'error error error',
't', '1.2500000e+02 1.2500000e+02 1.2500000e+02']

我无法想出这样做的正则表达式。

3 个答案:

答案 0 :(得分:4)

您可以使用以下正则表达式来拆分此字符串(最后一个列表' s项目将是一个空字符串。):

    import re
    s = "index ( 1.0000000e+00 2.0000000e+00 3.0000000e+00)  _x_ ( error error error ) t ( 1.2500000e+02 1.2500000e+02 1.2500000e+02 ) "
    re.split("\s*?(?:\(|\))\s*", s)

这导致:

['index', '1.0000000e+00 2.0000000e+00 3.0000000e+00', '_x_', 'error error error', 't', '1.2500000e+02 1.2500000e+02 1.2500000e+02', '']

此外,您可以使用以下正则表达式提取字符串的组件,然后处理它们(例如从子字符串中剥离空格)。这个正则表达式假设字符串具有平衡的左/右parens:

re.findall("(?:(?<=\()[^)]*?(?=\))|[a-z_]+)",s)

它应该产生以下输出:

['index', ' 1.0000000e+00 2.0000000e+00 3.0000000e+00', '_x_', ' error error error ', 't', ' 1.2500000e+02 1.2500000e+02 1.2500000e+02 ']

答案 1 :(得分:2)

这是一个列表理解:

[item.strip() for item in s.replace("(", ")").split(")")]

这里有一些基本上可以满足您需求的代码。几乎。

mylist = []
for item in s.replace("(", ";").replace(")", ";").split(";"):
    mylist.append(item.strip())

print mylist[:-1]

输出:

['index', '1.0000000e+00 2.0000000e+00 3.0000000e+00', '_x_', 'error error error', 't', '1.2500000e+02 1.2500000e+02 1.2500000e+02']

答案 2 :(得分:1)

类似于@ AlexKotliarov的答案,但只是分裂空白和parens

>>> import re
>>> re.split(r'[\s()]+', s)

输出:

['index', '1.0000000e+00', '2.0000000e+00', '3.0000000e+00', '_x_', 'error', 'error', 'error', 't', '1.2500000e+02', '1.2500000e+02', '1.2500000e+02', '']

阐释:

拆分集+中的一个或多个字符[ .. ]:空格\s和括号(&amp; )