ハード・ラップを含むテキスト・ファイルがたくさんあります(改行は約80文字です)。私はそれを元に戻して、それらの文章をすべて一緒に結合したいが、新しい章や段落である新しい行を維持したい。新しい行がスペースで区切られていて、新しい改行がない場合(テキストの改行を元に戻す)
すなわちIdが\ n「の
「と次の文字が別でない場合だけ」次のPythonコードは、私が何をしたいんではなく、非常に効率的に、そしてI」と「N \」を置換したいですむしろ正規表現やsedでそれをやります。
s = open(filename, 'r').read()
p = s.split('\n\n') # split into paragraphs
p = [x.replace('\n', ' ') for x in p] # iterate all paragraphs, replace \n
s2 = '\n\n'.join(p) # join paragraphs back together
Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Vivamus porta dui quis aliquet interdum. Sed
in pellentesque libero. Quisque tempus nisl nec
nisl condimentum ullamcorper.
Mauris vulputate nibh nec ipsum mattis rutrum.
Nunc nec tristique magna, non sagittis lacus.
Aliquam id urna lectus.
Maecenas volutpat libero quis erat mollis, et
aliquet purus dignissim. Sed faucibus, lectus in
auctor ornare, dolor libero ultrices sem, vel
iaculis ex nulla quis lacus.
はなるはずです。
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus porta dui quis aliquet interdum. Sed in pellentesque libero. Quisque tempus nisl nec nisl condimentum ullamcorper.
Mauris vulputate nibh nec ipsum mattis rutrum. Nunc nec tristique magna, non sagittis lacus. Aliquam id urna lectus.
Maecenas volutpat libero quis erat mollis, et aliquet purus dignissim. Sed faucibus, lectus in auctor ornare, dolor libero ultrices sem, vel iaculis ex nulla quis lacus.
更新
私が試したし、5メガバイトのテキストファイルに以下の5つのPythonのメソッドを時限ました。 3つの正規表現のすべてのメソッドが、Pythonの分割/置換/結合メソッドよりも1桁遅いことがわかりました。
def m1(s):
p = s.split('\n\n') # split into paragraphs
p = [x.replace('\n', ' ') for x in p] # iterate all paragraphs, replace \n
r = '\n\n'.join(p) # join paragraphs back together
return r
def m2(s):
r = re.sub(r"(?<!\n)\n(?!\n)", " ", s)
return r
def m3(s):
p = re.compile(ur'(?<!^)\n(?=\S)', re.MULTILINE)
r = re.sub(p, u" ", s)
return r
def m4(s):
r = "".join(["".join(v) if k else " ".join(map(str.strip, v))+"\n" for k, v in groupby(s, str.isspace)])
return r
def repl(m):
return (' ' if len(m.group(1))==1 else m.group(1)) + m.group(2)
def m5(s):
r = re.sub(r'(\n+)(.)', repl, s)
return r
結果:
np.array(timeit.repeat('r=m1(s)', 'from __main__ import *', repeat=5, number=N))/N
Out[4]: array([ 0.01343679, 0.0136183 , 0.0153013 , 0.0122381 , 0.01205051])
np.array(timeit.repeat('r=m2(s)', 'from __main__ import *', repeat=5, number=N))/N
Out[5]: array([ 0.10881839, 0.108728 , 0.10904381, 0.10862441, 0.10867569])
np.array(timeit.repeat('r=m3(s)', 'from __main__ import *', repeat=5, number=N))/N
Out[6]: array([ 0.1358021 , 0.1352592 , 0.13556101, 0.1357465 , 0.1354876 ])
np.array(timeit.repeat('r=m4(s)', 'from __main__ import *', repeat=5, number=N))/N
Out[7]: array([ 2.51403842, 2.37821078, 2.4169096 , 2.56688828, 2.36240571])
np.array(timeit.repeat('r=m5(s)', 'from __main__ import *', repeat=5, number=N))/N
Out[8]: array([ 0.16381941, 0.1616353 , 0.1620033 , 0.1617353 , 0.1615443 ])
ありがとうございました。なぜこれが投票権を得たのか分かりません。それは私のために働いた。 ( "\ n(?!\ n)"、 ""、text) – memo
私は、このような場合には、これは段落を保存しません。 – hek2mgl
実際に段落を保存しました。 – memo