解析包含#作为分隔符的字符串

时间:2016-05-11 08:54:59

标签: python regex list parsing

示例字符串 -

"{1#2#3,4#5#6,7#8#9,10#11#12}"

我希望这是一个2D数组/列表。 喜欢 -

[
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
  [10, 11, 12]
]

在python中执行此操作的最优雅方法是什么?

我试图在','的基础上先拆分。然后我得到一个清单。对于电梯中的每件物品,我将其拆分为#'。这样我就可以完成它。 但我想要一个干净利落的方式。

7 个答案:

答案 0 :(得分:5)

>>> s="{1#2#3,4#5#6,7#8#9,10#11#12}"
>>> list(map(lambda x:list(map(int, x.split('#'))), s.strip('{}').split(',')))
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]

以下是每个步骤的结果:

>>> s
'{1#2#3,4#5#6,7#8#9,10#11#12}'
>>> s.strip('{}')
'1#2#3,4#5#6,7#8#9,10#11#12'
>>> s.strip('{}').split(',')
['1#2#3', '4#5#6', '7#8#9', '10#11#12']
>>> list(map(lambda x:x.split('#'), s.strip('{}').split(',')))
[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9'], ['10', '11', '12']]

答案 1 :(得分:1)

s = "{1#2#3,4#5#6,7#8#9,10#11#12}"
print(list(map(str.split, s.strip("{}").replace("#"," ").split(",")))
[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9'], ['10', '11', '12']]

如果你真的想要整理,那么列表comp并转换为int:

print([list(map(int,_s.split("#"))) for _s in  s.strip("{}").split(",")])

答案 2 :(得分:1)

少吵:

map(lambda x: map(int, x.split('#')), s.strip("{}").split(','))

答案 3 :(得分:1)

使用renumpy的组合:

>>> import re
>>> import numpy as np
>>> s = "{1#2#3,4#5#6,7#8#9,10#11#12}"
>>> digits = re.findall('\d+', s)
>>> rows = s.count(',') + 1
>>> np.array(digits, dtype=int).reshape(rows, len(digits)/rows)
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])

答案 4 :(得分:0)

与使用map的现有答案相比,我建议使用嵌套列表理解:

[[int(x) for x in row.split("#")] for row in s.strip("{}").split(',')]

使用示例:

s = "{1#2#3,4#5#6,7#8#9,10#11#12}"
l = [[int(x) for x in row.split("#")] for row in s.strip("{}").split(',')]
print(l)
# Output:  [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]

稍微更短的选择是将map和列表理解结合起来:

[list(map(int, row.split("#"))) for row in s.strip("{}").split(',')]

答案 5 :(得分:0)

一种简单的方法是使用列表理解:

[list(map(int, sub.split('#'))) for sub in s.strip('{}').split(',')]

答案 6 :(得分:0)

这个很简单:)

对于

s="{1#2#3,4#5#6,7#8#9,10#11#12}"

[el.split('#') for el in s[1:-1].split(',')]

你可以得到

[['1','2','3'],['4','5','6'],['7','8','9'],['10' ,'11','12']]