【问题标题】:Python3 text replacement optimizationPython3文本替换优化
【发布时间】:2017-12-12 22:52:13
【问题描述】:

我的问题是关于优化我目前进行文本替换的方式。

我正在构建一个脚本,它会在脚本运行时用随机实际值替换其中包含变量的问题。

我的脚本目前执行的操作类似于以下内容(使用随机库):

def rand_var():
    rndvar = ['one', 'two', 'three']
    shuffle(rndvar)
    return rndvar

rndvar = rand_var()

x = 'blah blah VAR1 blah blah VAR2 blah blah'

x = x.replace('VAR1', rndvar[0])
x = x.replace('VAR2', rndvar[1])

rndvar 列表是随机的,在字符串 x 内,VAR1 被第一个随机元素替换,VAR2 被第二个替换。

我想知道是否有办法重写多个 x = x.replace 行,以便我仍然可以将字符串(问题)中的变量指定为 VAR1 VAR2 等,但让单个替换行知道 VAR1表示用 rndvar[0] 替换,VAR2 表示用 rndvar[1] 等替换。

我的问题(字符串)将包含来自多个列表的元素,代表不同的事物(但所有字符串)。

感谢大家的回复,非常感谢!

【问题讨论】:

  • 所以只需点击问题底部的edit 并添加它。

标签: python python-3.x


【解决方案1】:

单遍替换的一个选项是re.sub

x = re.sub(r'\bVAR(\d+)\b', lambda m: rndvar[int(m.group(1)) - 1], x)

您还可以使用简单的zip 循环来替换通行证:

for placeholder, replacement in enumerate(('VAR1', 'VAR2'), rndvar):
    x = x.replace(placeholder, replacement)

【讨论】:

  • 我刚刚测试了第一个选项,它完全符合我的要求。非常感谢!
【解决方案2】:

您可以使用正则表达式和字符串格式:

import re
from random import shuffle
def rand_var():
   rndvar = ['one', 'two', 'three']
   shuffle(rndvar)
   return rndvar

rndvar = rand_var()

x = 'blah blah VAR1 blah blah VAR2 blah blah'
new_x = re.sub('(?<=\s)VAR\d+(?=\s)', '{}', x).format(*[rndvar[i] for i in map(int, re.findall('(?<=VAR)\d+', x))])

输出(随机生成):

'blah blah one blah blah two blah blah'

【讨论】:

  • 我非常喜欢这种方法,但是当我测试它时,VAR1 被替换为第一个元素,VAR2 被替换为第二个元素。但是,如果我执行 VAR1 和 VAR1,或者 VAR1 和 VAR3,我会得到相同的结果,而不是第一个和第一个,以及第一个和第三个元素。
  • 很酷 :-) 感谢您的宝贵时间,非常感谢!
【解决方案3】:

您可以轻松地循环遍历rndVar 数组并使用索引指定替换字符串

def rand_var():
    rndvar = ['one', 'two', 'three']
    shuffle(rndvar)
    return rndvar

rndvar = rand_var() #['one', 'two', 'three']

x = 'blah blah VAR1 blah blah VAR2 blah blah'

#For every rndvar item, replace VAR+it's pos with the current rndVar value
for i in range(len(rndvar)):
   x = x.replace("VAR"+str(i+1),rndvar[i])

【讨论】:

  • 最好用for i, r in enumerate(rndvar):
【解决方案4】:

你可以试试这个

for i in range(1,3):
    x.replace ("VAR{}".format(i), rndvar[i])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2014-06-19
    相关资源
    最近更新 更多