使用Python每64个字符插入一个换行符

时间:2010-04-17 07:54:39

标签: regex python

使用Python我需要每64个字符在字符串中插入换行符。在Perl中很简单:

s/(.{64})/$1\n/

如何使用Python中的正则表达式来完成? 有更多的pythonic方法吗?

7 个答案:

答案 0 :(得分:30)

与Perl相同,但使用反斜杠而不是美元来访问组:

s = "0123456789"*100 # test string
import re
print re.sub("(.{64})", "\\1\n", s, 0, re.DOTALL)

re.DOTALL相当于Perl的s/选项。

答案 1 :(得分:23)

没有正则表达式:

def insert_newlines(string, every=64):
    lines = []
    for i in xrange(0, len(string), every):
        lines.append(string[i:i+every])
    return '\n'.join(lines)

更短但可读性更低(imo):

def insert_newlines(string, every=64):
    return '\n'.join(string[i:i+every] for i in xrange(0, len(string), every))

上面的代码适用于Python 2.x.对于Python 3.x,您希望使用range而不是xrange

def insert_newlines(string, every=64):
    lines = []
    for i in range(0, len(string), every):
        lines.append(string[i:i+every])
    return '\n'.join(lines)

def insert_newlines(string, every=64):
    return '\n'.join(string[i:i+every] for i in range(0, len(string), every))

答案 2 :(得分:13)

我会选择:

import textwrap
s = "0123456789"*100
print '\n'.join(textwrap.wrap(s, 64))

答案 3 :(得分:8)

带着@ J.F。塞巴斯蒂安的解决方案更进一步,这是几乎罪犯: - )

import textwrap
s = "0123456789"*100
print textwrap.fill(s, 64)
看起来......没有正则表达!因为你知道...... http://regex.info/blog/2006-09-15/247

感谢您向我们介绍textwrap模块......虽然它自2.3以来一直在Python中,但我从未意识到它(是的,我会公开承认)!!

答案 4 :(得分:4)

小小,不好看:

"".join(s[i:i+64] + "\n" for i in xrange(0,len(s),64))

答案 5 :(得分:3)

我建议采用以下方法:

"\n".join(re.findall("(?s).{,64}", s))[:-1]

这或多或少是非RE方法利用RE引擎进行循环。

在我作为家庭服务器的非常慢的计算机上,这给出了:

$ python -m timeit -s 's="0123456789"*100; import re' '"\n".join(re.findall("(?s).{,64}", s))[:-1]'
10000 loops, best of 3: 130 usec per loop

AndiDog的方法:

$ python -m timeit -s "s='0123456789'*100; import re" 're.sub("(?s)(.{64})", r"\1\n", s)'
1000 loops, best of 3: 800 usec per loop
gurney alex's 2nd / Michael的方法:

$ python -m timeit -s "s='0123456789'*100" '"\n".join(s[i:i+64] for i in xrange(0, len(s), 64))'
10000 loops, best of 3: 148 usec per loop

我不认为textwrap方法对于问题的说明是正确的,所以我不会计时。

修改

更改答案,因为它不正确(对我感到羞耻!)

编辑2

只是为了它的乐趣,使用itertools的无RE方法。它在速度上排名第三,而且它不是Pythonic(太lispy):

"\n".join(
   it.imap(
     s.__getitem__,
     it.imap(
       slice,
       xrange(0, len(s), 64),
       xrange(64, len(s)+1, 64)
     )
   )
 )

$ python -m timeit -s 's="0123456789"*100; import itertools as it' '"\n".join(it.imap(s.__getitem__, it.imap(slice, xrange(0, len(s), 64), xrange(64, len(s)+1, 64))))'
10000 loops, best of 3: 182 usec per loop

答案 6 :(得分:1)

itertools有一个很好的函数grouper的配方,对此有好处,特别是如果你的最终切片少于64个字符并且你不想要切片错误:

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

像这样使用:

big_string = <YOUR BIG STRING>
output = '\n'.join(''.join(chunk) for chunk in grouper(big_string, 64))