【问题标题】:Find, replace and print out updated string查找、替换和打印出更新的字符串
【发布时间】:2018-06-09 10:17:04
【问题描述】:

我正在尝试创建一个 python 脚本,该脚本在 string 中有 10-20 行固定数据,其中 2 个特殊字符需要替换为 不同,随机 string 使用randomword()

import random, string

def randomword(length):
   letters = string.ascii_lowercase
   return ''.join(random.choice(letters) for i in range(length))


junk = """
random_string1 = {};
random_string2 = {};
random_string3 = {};
random_string4 = {};
random_string5 = {};
"""

stra = string.replace(junk, '{}', randomword(40))
print (stra)

字符串中的两个特殊字符是{},我想遍历字符串以找到这些字符并将它们替换为由randomword()生成的不同随机string

以上是我得到的,这段代码替换了所有出现的地方 {} 带有随机字符串,但它们具有相同的值,我希望每个 {} 具有不同的值。

我不知道如何将其放入loop。任何帮助表示赞赏。

【问题讨论】:

  • 随机生成单词并使用string.format(*words)
  • @AntonvBR 我可以创建随机词,使用randomword(int),我在哪里使用string.format?介意写一个快速的答案:p
  • 对不起,我去睡觉了。 stackoverflow.com/a/48014786/7386332 写下了我心中的答案。

标签: python string loops random str-replace


【解决方案1】:

使用randint(97, 122)

import random 


def randomword(length):
   s = ""
   for _ in range(length):
       a = random.randint(97, 122)
       s += chr(a)
   return s

def replace(original_string, string_to_replace):
    result_string = ""
    while original_string.find(string_to_replace) >= 0:
      pos = original_string.find(string_to_replace)
      result_string += original_string[0: pos]
      result_string += randomword(40)
      next_pos = pos+2
      original_string = original_string[next_pos:]
    result_string += original_string[:]
    return result_string

junk = """
random_string1 = {};
random_string2 = {};
random_string3 = {};
random_string4 = {};
random_string5 = {};
"""

stra = replace(junk, "{}")
print (stra)

【讨论】:

  • 如果可能的话,我希望随机字符为小写,随机字符长度为 40。
  • 嘿@Hunter.S.Thompson 我已经根据你的要求编辑了我的代码
【解决方案2】:

由于您已经在使用string formatting '{}' 的默认占位符,您可以这样做:

>>> print(junk.format(*(randomword(40) for _ in range(junk.count('{}')))))

random_string1 = lazbdzezssemtsfknajawriafozpjwizigykvmac;
random_string2 = pxhkyrnjiqsvcivcppqqpbwuocsvbfauygdrwpuj;
random_string3 = ewhrsryjtfwtmulmqfqxzrzvyspiefrddpzrxkvq;
random_string4 = sqiulddoevddtieymjiexnmzezrdayvwigmsmgld;
random_string5 = evscqvrccknkulpkqchodcjlognsnrcxqcsexnrv;

【讨论】:

  • 工作几乎完美,谢谢!只有一件事,是否只有当字符{} 在一起时才会发生替换,就像这样:{},因为如果文本包含其他{,并且在字符后面带有新行,那么它似乎是抛出错误。
  • 这取决于两者之间的关系。例如。 {2} 将被传递给 .format() 的第三个(索引 2)位置参数替换。有关其他详细信息,您可以查看链接的文档。我假设你的字符串中有确切的{}
【解决方案3】:

可以使用正则表达式:

>>> print(re.sub('{}', lambda _: randomword(40), junk))

random_string1 = emgdidmmghkunqkwdfcnvsffdnfhvqrybhqdfklh;
random_string2 = mgggwchtzpuhntnfxzpsmkarkwnlghcwicnvxmpt;
random_string3 = liemdzegmzfpuozktclxnmfmavjkaxqhrfaldqkn;
random_string4 = ugchyijmsvzmeaiyzyaiudrnnfskzdboukvdwiye;
random_string5 = rfazvtvhygfixielqzbuhlnzvjjtrkhsdetomjri;

【讨论】:

  • 我是否可以确保为每个 random_string 创建的随机文本与为早期 random_strings 创建的随机文本不同?
  • 当然,有办法。但是您现在打算使用较短的字符串还是不使用整个字母表?你想产生多少个字符串?
  • 目前我正在使用这个答案来创建随机的十六进制整数,它有 2 个字符长并用生成的值替换 {},很有可能有一对相同的.我将创建超过 20-30 个字符串,其中 2 个字符作为替换而不是随机字符串。使用这个函数:binascii.b2a_hex(os.urandom(1)),我可以对随机字符串和十六进制整数使用相同的答案,这样它们就不会重复自己了
  • 好吧,是的,这么小的数字就完全不同了。如果您尝试使用您的原始数字,您将无法产生重复:-)。我可能会使用random.sample(range(256), n) 来选择 n 个唯一数字(其中 n 是您需要的数量)。或者保留一组仍然可用或已使用的号码并相应地选择和更新。
猜你喜欢
  • 2019-09-03
  • 2011-08-22
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
相关资源
最近更新 更多