我有一个python项目,我实际上是编写自定义语言,为此我需要一个可以用不同的数据替换用户输入的字符串的函数,例如随机数(很难解释我想要做什么c: )
这方面的一个例子是用户输入命令行:
j@dev-box$ file write hi.txt {RANDOM_INT[1, 20]}
并且该函数将运行如下:
parseOutput = parseFunction(userInputString) # userInputString = "file write hi.txt {RANDOM_INT[1,20]}
然后parseOutput将等于file write hi.txt 14
,随机数代替{RANDOM_INT [x,x]}标记
我希望自己找到的东西很清楚,因为很难解释。
答案 0 :(得分:0)
您可以尝试使用Python中的str.find
功能。 Documentation
示例:
def parseFunction(input):
index = input.find('{') # or look for more i.e. find('{RANDOM_INT')
return input[:index] + ' ' + randomInt # remember to add the space
您可以使用内置库randomInt
中的random.randInt
生成random.py
。 Documentation
答案 1 :(得分:0)
这是你需要的吗?
import re
import random
def parseFunction(string):
matches = re.match('.*\{r\[(\d+),(\d+)\]\}.*',string)
rand = random.randint(int(matches.groups()[0]), int(matches.groups()[1]))
result = re.sub('\{r\[(\d+),(\d+)\]\}',str(rand),string)
return result
答案 2 :(得分:0)
好吧,我建议您使用Jinja2模板,而不是使用Python模板字符串(功能强大但有限)。
这个模板引擎以开发Web应用程序而闻名。
要实施自定义语言,您可以使用过滤器。这是一个例子:
首先导入所需的模块:
import random
from jinja2.environment import Environment
定义一个过滤器来计算一个随机数,如下所示:
def random_int(value, x, y):
return "{0}".format(random.randint(x, y))
注意:此处未使用值参数。
定义Jinja环境并添加自定义过滤器:
env = Environment()
env.filters["RANDOM_INT"] = random_int
然后您可以像这样使用它(您必须稍微更改用户输入以符合Jinja模板语法):
user_input = 'file write hi.txt {{ "" | RANDOM_INT(1, 10) }}'
template = env.from_string(user_input)
result = template.render()
结果:
print(result)
# file write hi.txt 9
优点:Jinja可以为您检查语法和缺少格式。
编辑:更多示例
您可以更改要使用的环境配置 单花括号而不是双花:
env = Environment(variable_start_string="{", variable_end_string="}")
您可以使用内置函数和过滤器,而不是创建自定义过滤器。
例如:将range()
函数与random
过滤器一起使用:
user_input = 'file write hi.txt { range(10) | random }'
template = env.from_string(user_input)
result = template.render()
print(result)
最后,您可以使用自己的函数扩展全局上下文
env = Environment(variable_start_string="{", variable_end_string="}")
env.globals["RANDOM_INT"] = random.randint
user_input = 'file write hi.txt { RANDOM_INT(1, 10) }'
template = env.from_string(user_input)
result = template.render()
print(result)