2016-06-07 65 views
-1

我有一個python項目,我基本上是編寫自定義語言的代碼,對於它我需要一個函數,可以用不同的數據替換用戶輸入的字符串,例如random數字(這是很難解釋什麼,我想要做的C :)Python 3 - 用字符串中的信息替換字符串的一部分

這方面的一個例子是用戶鍵入到命令行:

[email protected]$ 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

請可以在downvoter解釋爲什麼他/她給我的帖子downvote?我將不勝感激他們的幫助,以改善我的帖子:) –

回答

0

的好,而不是使用Python的模板字符串(這是強大的,但有限的),我建議你使用Jinja2模板。

此模板引擎以開發Web應用程序而聞名。

要實現您的自定義語言,您可以使用過濾器。下面是一個例子:

首先導入所需的模塊:

import random 

from jinja2.environment import Environment 

定義一個過濾器,以計算一個隨機數,這樣的:

def random_int(value, x, y): 
    return "{0}".format(random.randint(x, y)) 

注:參數是這裏不使用。

定義神社的環境,並添加自定義過濾器:

env = Environment() 
env.filters["RANDOM_INT"] = random_int 

然後,您可以使用它像這樣(你需要稍微改變用戶輸入符合神社模板語法):

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 

Avantages:金賈可以CHEC k您的語法和缺失格式。

編輯:更多的例子

可以改變環境配置爲使用 單花括號代替雙:

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) 
+0

哇,這看起來非常強大!當我回家時,會有一個適當的修補程序:) –

+0

謝謝,完美地解決了我的問題。將upvote並嘗試添加爲接受的答案!只是一個簡單的問題,但;我的項目被設計爲在沒有安裝軟件包的情況下運行在python上。我提取了jinja2文件夾並將其與我的項目一起打包,並且它可以工作,但我想知道這是否合法?謝謝,傑伊。 PS:如果不是,那麼我沒有管理它:P –

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 

你就可以使用random.randIntrandomInt內置庫random.pyDocumentation

+0

謝謝,但我正在尋找從輸入抓取randInt參數:)。我會對此進行修補,看看我是否可以適應它 –

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 
+0

這看起來不錯(雖然不能測試它幾個小時),但它似乎是爲Python 2? –

+0

嗯。似乎返回一個非類型錯誤?回溯(最近最後調用): 文件 「」,第1行,在 parseFunction( 「喜{R [1,2]}」) 文件 「」,第3行,在parseFunction 蘭特=隨機的。 randint(int(matches.groups()[0]),int(matches.groups()[1])) AttributeError:'NoneType'對象沒有屬性'groups' –