将字符串中的`{}`替换为十六进制值

2024-06-26 14:01:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串,里面有一些随机的东西,例如:

random_string = """

asdasdasd23123asdnos{}n
asdnoiaf{}aosndiasdasd
asd{}1239i123nig
hpodpfh{}askmdiasd
{asdasda
}asdasdasd
"""

我想用一个随机的十六进制值替换该字符串中出现的{},该值与之前替换其他花括号的值不同。在

我使用这个函数来生成100%随机的十六进制值。在

^{pr2}$

我缺少一个函数或循环,其中十六进制的值取自列表get_random(n),将字符串中的{}替换为列表中的十六进制值并打印输出,如果{}中有任何字符,则应跳过它们。在

我使用的是模块re,但并不是所有的值都是随机的,其中一些值很有可能是相似的。在

print(re.sub('{}', lambda _: binascii.b2a_hex(os.urandom(1)) + ' \\', random_string))

感谢任何帮助!在


Tags: 函数字符串re列表stringrandom括号asd
2条回答

正如我在OP评论中所暗示的,如果只有{}s,中间没有字符,那么下面的工作就可以了(用python3.6测试)

import binascii
import os

random_string = """

asdasdasd23123asdnos{}n
asdnoiaf{}aosndiasdasd
asd{}1239i123nig
hpodpfh{}askmdiasd
{}asdasdasd
"""


def get_random(n):
    out = set()
    while len(out) < n:
        out.add(binascii.b2a_hex(os.urandom(1)).decode())
    return list(out)


print(random_string.format(*get_random(random_string.count('{}'))))

输出:

^{pr2}$

我觉得你把事情搞得太复杂了。函数b2a_hex生成2位十六进制字符串。因为只有256(0->;255)个元素,所以只需生成所有元素,然后洗牌并生成这些元素,直到它们消失:

def unique_hex():
    all_hex=['{:02x}'.format(e) for e in range(256)]
    random.shuffle(all_hex)
    for e in all_hex:
        yield e
    # returns None at this point. Add what you think it should do with no more

您可以看到每次调用它都是00ff之间所有唯一十六进制数字的随机列表:

^{pr2}$

然后您的正则表达式变成:

re.sub(r'\{\}', lambda m: next(unique_hex()), random_string)

相关问题 更多 >