如何在Python中将文本右对齐?

3

我有一段包含多种长度的虚拟文本。

sample_text = """Nunc tempus metus sem, at posuere nulla volutpat viverra. Sed nec nisl imperdiet, egestas ex et, sodales libero. Suspendisse egestas id dui at aliquet. Nulla a justo neque. Pellentesque non urna iaculis, maximus dolor at, pellentesque eros. Duis mi velit, ornare eu mollis sed, congue eget nisl. Ut suscipit, elit eu mattis vehicula, justo quam vulputate urna, nec tempor augue ligula sed nisl. Phasellus vel augue eu nibh sodales pretium ornare vel felis.Vivamus vitae suscipit orci. """

我正在寻找将文本设置为 右对齐 的方法。查看了文字换行文档,但它默认只支持左对齐。

import textwrap
wrapper = textwrap.TextWrapper(width=50)
dedented_text = textwrap.dedent(text=sample_text)
print(wrapper.fill(text=dedented_text))

文字包装还提供了许多功能,如缩短、缩进等。

找到了另一种文本对齐的方式。

str.ljust(s, width[, fillchar])
str.rjust(s, width[, fillchar])
str.center(s, width[, fillchar])

但是上述函数仅在文本长度短于宽度时起作用。

是否有类似于上述的函数或者方式来对齐文本?


@JoeFerndz,docx与此有何关系?我认为OP是在询问简单字符串... - Tomerikoo
抱歉之前的链接有误。这里是一个类似问题的SO链接:https://dev59.com/Wqvka4cB1Zd3GeqPqkny - Joe Ferndz
我还发现了这个...https://stackoverflow.com/questions/17862989/how-can-i-wrap-and-indent-strings-from-dictionary-in-python-output - Joe Ferndz
@JoeFerndz 很像第三个链接,但没有得到正确的对齐。 - mhhabib
有趣的问题。已经收藏了,明天会解决它。在此之前,会看看其他人是否已经解决了它。 - Joe Ferndz
1个回答

5

简单的方法是:

import re
wrapper = textwrap.TextWrapper(width=50)
dedented_text = textwrap.dedent(text=sample_text)

txt = wrapper.fill(text=dedented_text)
def justify(txt:str, width:int) -> str:
    prev_txt = txt
    while((l:=width-len(txt))>0):
        txt = re.sub(r"(\s+)", r"\1 ", txt, count=l)
        if(txt == prev_txt): break
    return txt.rjust(width)

for l in txt.splitlines():
    print(justify(l, 50))

几点说明:

(1) 对齐关注的是行而不是字符串内的行,因此您应该逐行对齐文本。 我不知道有批量方法。

(2) 您始终通过拉伸空格来进行对齐-这只是您选择哪些空格以及如何拉伸它们的决定-我在网上找到的所有示例都只是在使用拉伸空格的方法方面略有不同...

输出:

Nunc  tempus  metus sem, at posuere nulla volutpat
viverra.  Sed  nec  nisl imperdiet, egestas ex et,
sodales  libero.  Suspendisse  egestas  id  dui at
aliquet.  Nulla  a  justo  neque. Pellentesque non
urna iaculis, maximus dolor at, pellentesque eros.
Duis  mi  velit, ornare eu mollis sed, congue eget
nisl.  Ut suscipit, elit eu mattis vehicula, justo
quam  vulputate  urna, nec tempor augue ligula sed
nisl.  Phasellus vel augue eu nibh sodales pretium
ornare  vel  felis.Vivamus  vitae  suscipit  orci.

代码排版整齐美观。但是我之前提到过需要右对齐和居中对齐。虽然已经实现了居中对齐,但仍在寻求右对齐。 - mhhabib
然后只需将最后一行替换为:print(l.rjust(50))center(40),具体取决于需要的对齐方式。 - Grzegorz Skibinski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接