将很长的字符串拆分为字符重叠的较小字符块

问题描述:

我有一长串字符需要拆分成较小的块,但块需要重叠。输出字符串的长度和重叠应该是可变的。将很长的字符串拆分为字符重叠的较小字符块

例子:

在一个文本文件,以此为出发点:

----------------------------------------------------- 

随着输出被写成这样:

--------------------- 
--------------------- 
--------------------- 
+4

这是令人困惑,因为你的例子只是一个字符重复,所以目前还不清楚它是如何重叠。如果字符串是ABCDEFGHI ...等,该怎么办? – 2012-07-24 17:25:04

+0

嗨戴夫,谢谢你的回应。 我只是想让我的例子尽可能简单。我试图弄清楚这些字符串大部分会重叠的想法,但是通过X来移位寄存器。 – Witold 2012-07-24 17:50:10

+0

对于更简单的答案,我会看@msw写的是什么;下一步是使用列表解析,如下所述。 – jmetz 2012-07-24 17:53:48

我想你的意思是这样的:

def get_overlapped_chunks(textin, chunksize, overlapsize): 
    return [ textin[a:a+chunksize] for a in range(0,len(textin), chunksize-overlapsize)] 

说明

这里我用一个列表理解,这只是获取输出字符串应该在哪里[0, step, 2*step,..., len(input)-chunksize]开始step = chunksize-overlapsize指数,然后在这些位置返回长度CHUNKSIZE的文本。

使用

此功能可以被用来如下:

>>> s = 'abcdefghijklmnopqrstuvwxyz' 
>>> s[0:5] 
'abcde' 

其中:

textin = ''.join(open(FILENAME, 'r').readlines()) # text as single line 

CHUNKSIZE=10 
OVERLAPSIZE = 2  

chunks = get_overlapped_chunks(textin, CHUNKSIZE, OVERLAPSIZE) 

fout = open(FILEOUT, 'w') 
fout.writelines(chunks) 
+0

嗨Mutzmatron, 感谢您的回应!对不起,密集,但输出去哪里?我在def下添加了f = open(“textin”,“r”),但是我没有掌握如何添加输出。 – Witold 2012-07-24 18:01:43

+0

'def ...'用于定义一个函数,并返回一个字符串列表,以便您可以使用它,例如,在文件的'writelines'函数中。我会更多地编辑代码... – jmetz 2012-07-24 18:04:10

给定一个字符串s,您可以使用得到一个序列切片给你的第0个字符直到(但不包括)第5个字符aracter。该range(start, end, step)功能给出了step

>>> range(0, len(s), 6) 
[0, 6, 12, 18, 24] 

开始start高达end越来越多的列表,两者结合让你像

>>> for i in range(0, len(s), 6): 
...  print s[i:i+8] 
... 
abcdefgh 
ghijklmn 
mnopqrst 
stuvwxyz 
yz 

因为片操作是“宽容”,它仍产生从s[24:34]开始的最后一行有少于8个字符的简短回答。

纯击:

length=20 
overlap=3 

while read line ; do 
    idx=0 
    while [ $idx -lt ${#line} ] ; do 
    echo "${line:idx:length}" 
    ((idx+=length-overlap)) 
    done 
done < "$infile"