在 Python 中,有什么巧妙的方法可以将文本递归地换行到一定数量的字符?
In Python, what's a neat way to recursively wrap text to a set number of characters?
我有这个字符串:
text = "abc def ghi jkl mno pqr stu vwx yz\nabc def ghi jkl mno pqr stu vwx yz"
我想将它包装成一个字符宽度(例如 5),使其变成这样:
abc d
ef gh
i jkl
mno
pqr s
tu vw
x yz
abc d
ef gh
i jkl
mno
pqr s
tu vw
x yz
非递归,这是我得到的:
text_in = text.split("\n")
text_out = []
width = 5
for line in text_in:
if len(line) < width:
text_out.append(line)
else:
text_out.append(line[:width])
text_out.append(line[width:])
print("\n".join(text_out))
所以,它只在领先的订单水平上做对:
abc d
ef ghi jkl mno pqr stu vwx yz
abc d
ef ghi jkl mno pqr stu vwx yz
应该如何递归或以其他巧妙的方式完成这种包装?
正则表达式 解决方法:
import re
def wrap_text(text, width):
if not width:
return text
else:
return re.sub(r'(.{' + str(width) + '})', '\1\n', text)
text = "abc def ghi jkl mno pqr stu vwx yz\nabc def ghi jkl mno pqr stu vwx yz"
(.{<width>})
- 将每个 <width>
个字符捕获到第一个带括号的组 (...)
测试用例#1:
print(wrap_text(text, 5))
输出:
abc d
ef gh
i jkl
mno
pqr s
tu vw
x yz
abc d
ef gh
i jkl
mno
pqr s
tu vw
x yz
测试用例#2:
print(wrap_text(text, 10))
输出:
abc def gh
i jkl mno
pqr stu vw
x yz
abc def gh
i jkl mno
pqr stu vw
x yz
我会用列表理解来做到这一点:
text = "abc def ghi jkl mno pqr stu vwx yz\nabc def ghi jkl mno pqr stu vwx yz"
res = [text[pos:pos+5] for pos in range(0, len(text), 5)]
for i in res:
print(i)
要处理新行字符,您可以用额外的空格替换新行:
text = text.replace("\n", " ")
或列表理解后:
for i in res:
if '\n' in i:
i = i.strip('\n')
print(i)
else:
print(i)
现在的结果是:
abc d
ef gh
i jkl
mno
pqr s
tu vw
x yz
abc d
ef gh
i jkl
mno
pqr s
tu vw
x yz
可以使用 for
循环来获取子字符串:
text = "abc def ghi jkl mno pqr stu vwx yz\nabc def ghi jkl mno pqr stu vwx yz"
llen = len(text); lst = []; stemp = ""
for i in range(llen):
if i % 5 == 0 and i>0:
lst.append(stemp)
stemp = ""
stemp += text[i]
else:
stemp += text[i]
for ll in lst:
print(ll)
输出:
abc d
ef gh
i jkl
mno
pqr s
tu vw
x yz
abc d
ef gh
i jkl
mno
pqr s
tu vw
Daniel Roseman 关于使用 textwrap.wrap
的建议发生了什么变化?只是为了完成,因为它消失了:
import textwrap
a = "abc def ghi jkl mno pqr stu vwx yz\nabc def ghi jkl mno pqr stu vwx yz"
for item in textwrap.wrap(a, 5):
print(item)
我有这个字符串:
text = "abc def ghi jkl mno pqr stu vwx yz\nabc def ghi jkl mno pqr stu vwx yz"
我想将它包装成一个字符宽度(例如 5),使其变成这样:
abc d
ef gh
i jkl
mno
pqr s
tu vw
x yz
abc d
ef gh
i jkl
mno
pqr s
tu vw
x yz
非递归,这是我得到的:
text_in = text.split("\n")
text_out = []
width = 5
for line in text_in:
if len(line) < width:
text_out.append(line)
else:
text_out.append(line[:width])
text_out.append(line[width:])
print("\n".join(text_out))
所以,它只在领先的订单水平上做对:
abc d
ef ghi jkl mno pqr stu vwx yz
abc d
ef ghi jkl mno pqr stu vwx yz
应该如何递归或以其他巧妙的方式完成这种包装?
正则表达式 解决方法:
import re
def wrap_text(text, width):
if not width:
return text
else:
return re.sub(r'(.{' + str(width) + '})', '\1\n', text)
text = "abc def ghi jkl mno pqr stu vwx yz\nabc def ghi jkl mno pqr stu vwx yz"
(.{<width>})
- 将每个<width>
个字符捕获到第一个带括号的组(...)
测试用例#1:
print(wrap_text(text, 5))
输出:
abc d
ef gh
i jkl
mno
pqr s
tu vw
x yz
abc d
ef gh
i jkl
mno
pqr s
tu vw
x yz
测试用例#2:
print(wrap_text(text, 10))
输出:
abc def gh
i jkl mno
pqr stu vw
x yz
abc def gh
i jkl mno
pqr stu vw
x yz
我会用列表理解来做到这一点:
text = "abc def ghi jkl mno pqr stu vwx yz\nabc def ghi jkl mno pqr stu vwx yz"
res = [text[pos:pos+5] for pos in range(0, len(text), 5)]
for i in res:
print(i)
要处理新行字符,您可以用额外的空格替换新行:
text = text.replace("\n", " ")
或列表理解后:
for i in res:
if '\n' in i:
i = i.strip('\n')
print(i)
else:
print(i)
现在的结果是:
abc d
ef gh
i jkl
mno
pqr s
tu vw
x yz
abc d
ef gh
i jkl
mno
pqr s
tu vw
x yz
可以使用 for
循环来获取子字符串:
text = "abc def ghi jkl mno pqr stu vwx yz\nabc def ghi jkl mno pqr stu vwx yz"
llen = len(text); lst = []; stemp = ""
for i in range(llen):
if i % 5 == 0 and i>0:
lst.append(stemp)
stemp = ""
stemp += text[i]
else:
stemp += text[i]
for ll in lst:
print(ll)
输出:
abc d
ef gh
i jkl
mno
pqr s
tu vw
x yz
abc d
ef gh
i jkl
mno
pqr s
tu vw
Daniel Roseman 关于使用 textwrap.wrap
的建议发生了什么变化?只是为了完成,因为它消失了:
import textwrap
a = "abc def ghi jkl mno pqr stu vwx yz\nabc def ghi jkl mno pqr stu vwx yz"
for item in textwrap.wrap(a, 5):
print(item)