如何用随机ASCII字符的字符串替换多次出现的字符?

时间:2019-07-09 05:02:32

标签: python

我正在尝试创建一个程序,以随机ASCII标点替换输入的单词之间的空格。

我已经尽力尝试使用string和random模块,但是到目前为止还没有运气。

    def basewords():
        print("Enter base words here:")
        q = str(input("TIP: Enter your desired words seperated by spaces only.\n> "))
        lst = [string.punctuation, string.digits]
        x = ''.join(random.choice(lst)(c) for c in q)
        q = q.replace(" ", x)
        print(q)

我希望单词之间的空格(例如Hello World Dog House)具有ASCII随机标点符号,以便理论上可以像“ Hello!World ^ Dog,House”那样结束。但是,目前,我收到了TypeError。非常感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

只需加入两个特殊字符列表,不要将它们放在random.choice的列表中。一个班轮示例:

''.join(i if i != ' ' else random.choice(string.punctuation + string.digits)
    for i in q)

您当然可以...

result = ''
for i in q:
    if i != ' ':
        result += i
    else:
        result += random.choice(string.punctuation + string.digits)
q = result

第二个示例是上面的单行代码示例的详细版本。 要了解它,您可以放心地将其拆分。

q = ''.join( LIST_COMPREHANSION )

这是用空字符串连接到LIST_COMPREHANSION里面的。您可以检查https://www.pythonforbeginners.com/basics/list-comprehensions-in-python了解详细信息。它包括:

EXPRESSION for i in q

表达式本身是三元运算符-https://book.pythontips.com/en/latest/ternary_operators.html

i if i != ' ' else random.choice(string.punctuation + string.digits)

但是使用str.replace无效,第二个参数是常量,您不能在其中使用随机字符生成器。

答案 1 :(得分:1)

您的TypeError的原因是因为以下这一行:

x = ''.join(random.choice(lst)(c) for c in q)

random.choice(iterable)返回iterable中的一个随机项,因为您的可迭代对象由字符串组成,所以它返回一个字符串。这样做(c)时,您尝试像函数一样调用字符串,这将引发TypeError,因为字符串不可调用。

那这样的事情呢?

def basewords():
    print("Enter base words here:")
    q = str(input("TIP: Enter your desired words seperated by spaces only.\n> "))
    specialchars = string.punctuation + string.digits
    def rand():
        return random.choice(specialchars)
    print(''.join(x.replace(' ', rand()) for x in q))

演示:

In [41]: basewords()
Enter base words here:
TIP: Enter your desired words seperated by spaces only.
> Hello World Dog House
Hello;World>Dog3House

答案 2 :(得分:0)

您不认为在第一个标点(33)和最后一个标点(47)的ascii值之间生成随机数会更容易实现。然后,您可以照常使用它的ascii值来查找相应的字符,从而照常在您的代码中使用它。

您可以进一步了解ascii表here:

<-希望它可以简化您的解决方案。

<-UpVote If HelpFul