【问题标题】:How to prevent escape characters from changing the output of a randomly generated Python string? [duplicate]如何防止转义字符改变随机生成的 Python 字符串的输出? [复制]
【发布时间】:2018-05-21 02:46:12
【问题描述】:

此代码输出一串随机生成的字符。为了 例如:V86Ijgh(!y7l0+x

import string
import random

password = ''.join([random.choice(string.printable) for i in range(15)])

print(password)

在出现\n等转义字符的情况下

V86Ijg\n!y7l0+x

并创建输出:

V86Ijg 
!y7l0+x

因为它初始化了一个新行 而不是打印出来:

V86Ij\n(!y7l0+x

像以前一样。

避免转义字符的预期输出(例如创建新行、制表符等)被解释的最佳方法是什么?我无法选择输入,因为它是随机的。我想知道如何以原始形式输出字符串而不删除原始字符串中的字符。我希望密码在生成时显示出来。

【问题讨论】:

  • 传递您认为可以接受的字符列表,而不是使用string.printable。
  • 您可以使用字符串的repr() 来打印我们的特殊字符。

标签: python python-3.x random line-breaks password-generator


【解决方案1】:

如果你想让特殊字符保持转义,你应该用转义字符编码你的字符串,即:

print(password.encode("unicode_escape").decode("utf-8")) 
# on Python 2.x: print(password.encode("string_escape"))

使用repr() 将在您的字符串周围添加单引号。

【讨论】:

    【解决方案2】:

    您可以通过使用集合运算符从string.printable 中取出所有空白字符来创建自己的字符集以供选择:

    chars = ''.join(set(string.printable) - set(string.whitespace))
    
    password = random.choice(chars)
    
    key_length = 1
    while(key_length < 15):
            password += random.choice(chars)
            key_length = key_length + 1
    
    print(password)
    

    请注意,整个循环可以用列表推导替换:

    password = ''.join([random.choice(chars) for _ in range(15)])
    

    编辑如果您想保留转义符和空格字符,但只想将密码打印到控制台,请使用repr() 函数:

    print(repr(password))
    

    【讨论】:

    • 我实现了列表理解并删除了 while 循环。但是,此“修复”不会阻止程序解释转义字符并在输出期间创建新行。
    • 查看我的编辑,我想如果它只是关于打印,那会处理它,我想我误解了你的问题
    猜你喜欢
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 2011-08-06
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多