Python 3 - 用字符串中的信息替换字符串的一部分

时间:2016-06-07 17:25:20

标签: python function python-3.x parsing

我有一个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]}标记

我希望自己找到的东西很清楚,因为很难解释。

3 个答案:

答案 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.pyDocumentation

答案 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)