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

big*_*num 23 python regex

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

s/(.{64})/$1\n/
Run Code Online (Sandbox Code Playgroud)

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

And*_*Dog 30

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

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

re.DOTALL相当于Perl的s/选择.


gur*_*lex 24

没有正则表达式:

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)
Run Code Online (Sandbox Code Playgroud)

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

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

上面的代码适用于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))
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案快一个数量级.`timeit.timeit`表示100000执行regexp解决方案需要27.8秒,而100000执行你的较短解决方案需要4.45秒. (5认同)
  • 我还说较短的版本是"最pythonic"的版本:单行,非常优雅,使用生成器和`join`方法. (4认同)

jfs*_*jfs 14

我会去:

import textwrap
s = "0123456789"*100
print '\n'.join(textwrap.wrap(s, 64))
Run Code Online (Sandbox Code Playgroud)

  • `textwrap`是空格感知的,所以这不能正确处理`"12345"*100`. (5认同)

wes*_*cpy 9

将@JF塞巴斯蒂安的解决方案更进一步,这几乎是犯罪的:-)

import textwrap
s = "0123456789"*100
print textwrap.fill(s, 64)
Run Code Online (Sandbox Code Playgroud)

看看马......没有正则表达!因为你知道... http://regex.info/blog/2006-09-15/247

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


Mic*_*ael 5

小,不好:

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