使用Python我需要每64个字符在字符串中插入换行符。在Perl中很简单:
s/(.{64})/$1\n/
如何使用Python中的正则表达式来完成? 有更多的pythonic方法吗?
答案 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
$ 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
方法对于问题的说明是正确的,所以我不会计时。
更改答案,因为它不正确(对我感到羞耻!)
只是为了它的乐趣,使用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))