什么是解析块实体的最有效和最简单的方法?

时间:2015-07-28 08:52:47

标签: python regex

我有数据集行,如:

"1234567 12345 123456789"
...
...

每列都有一个指定的块长度,即第一列8“1234567”,第二列6和第三列9个字符,依此类推。

我可以将它们分开:

line="1234567 12345 123456789"
datahash[0]=line[0:8]
datahash[1]=line[9:15]
datahash[2]=line[16:25]

但这是最蟒蛇和最有效的方式吗?

我能用正则表达式实现这一目标吗?它会更有效率吗?

3 个答案:

答案 0 :(得分:2)

sample = (
"1234567 12345 123456789",
"1234567 12345 123456789",
"1234567 12345 123456789",
"1234567 12345 123456789",
)

def slices_at(sequence,offsets=((0,7),(8,13),(14,25))):
  for line in sequence:
    yield tuple(line[x:y] for (x,y) in offsets)

result = list(slices_at(sample))

收率:

>>> result
[('1234567', '12345', '123456789'), ('1234567', '12345', '123456789'), ('1234567', '12345', '123456789'), ('1234567', '12345', '123456789')]

重新阅读你的问题,我已经意识到你想要前两个字段的终止空白。

这是一个采用块长度列表的新函数:

def slices_by_block_length(sequence,block_lengths=(8,6,9)):
  prev = 0
  offsets = []
  for length in block_lengths:
    offsets.append((prev,prev+length))
    prev += length
  for line in sequence:
    yield tuple(line[x:y] for (x,y) in offsets)

收率:

[('1234567 ', '12345 ', '123456789'), ('1234567 ', '12345 ', '123456789'), ('1234567 ', '12345 ', '123456789'), ('1234567 ', '12345 ', '123456789')]

答案 1 :(得分:0)

您也可以拆分空格。这样你就不会使用索引,但解决方案仍然很强大。

sample = ["1234567 12345 123456789",
"1234567 12345 123456789",
"1234567 12345 123456789",
"1234567 12345 123456789"]

def getValues(line):
    return line.split()

for line in sample:
    print getValues(line)

将产生您想要的信息。

答案 2 :(得分:0)

我更喜欢进一步的解决方案:

def slice_by_block_length(self,s,block_lengths):

    arr=[]
    for i in range(len(block_lengths)):
        arr.append(s[sum(block_lengths[0:i]):sum(block_lengths[0:i+1])])
    return arr

致电:

linearr=myClass.slice_by_block_length(sequence,[8,6,9])