最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python?按規(guī)則解析并替換字符串中的變量及函數(shù)(示例代碼)

 更新時(shí)間:2023年11月20日 09:18:04   作者:授客  
這篇文章主要介紹了Python?按規(guī)則解析并替換字符串中的變量及函數(shù),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

按規(guī)則解析并替換字符串中的變量及函數(shù)

需求

1、按照一定規(guī)則解析字符串中的函數(shù)、變量表達(dá)式,并替換這些表達(dá)式。這些函數(shù)表達(dá)式可能包含其它函數(shù)表達(dá)式,即支持函數(shù)嵌套

2、函數(shù)表達(dá)式格式:${ __函數(shù)名稱() }、${__函數(shù)名稱( 函數(shù)參數(shù) )}

3、變量表達(dá)式格式:${ varName }

注意:

  • 函數(shù)名稱以__打頭
  • ${ 之間不能有空格
  • 函數(shù)名稱和函數(shù)的左括號(hào) ( 之間不能有空隔
  • 函數(shù)支持嵌套,形如:${ __function1( ${__function2()} )}
  • 函數(shù)參數(shù)如果是字符串(包括由嵌套函數(shù)返回值),需要使用單引號(hào)、雙引號(hào)引用 形如 ${ __function1( "str_value", 123)} ,${ __function1(key="arg_value")},${ __function1(key=\'arg_value\')},
  • 函數(shù)參數(shù)支持python原生函數(shù) 形如 ${ __function1( set([1,2,3]) )}

實(shí)現(xiàn)代碼

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
REGEX_PATTERN_FOR_DYNAMIC =  re.compile('(\${\s*.+\s*})', re.DOTALL) # 用于獲取動(dòng)態(tài)值中的表達(dá)式
REGEX_PATTERN_FOR_VAR = re.compile('(\${\s*[^{}]+s*})', re.DOTALL) # 用于獲取動(dòng)態(tài)值中的變量表達(dá)式
REGEX_PATTERN_FOR_FUNC_DEFINITION = re.compile('\${\s*__.+?\(.*?\)\s*}', re.DOTALL) # 用于獲取函數(shù)表達(dá)式中的函數(shù)名稱及其參數(shù)
REGEX_PATTERN_FOR_FUNC_NAME_WITH_ARGS = re.compile('\${\s*(__.+?)\((.*?)\)\s*}', re.DOTALL) # 用于獲取函數(shù)表達(dá)式中的函數(shù)名稱及其參數(shù)
def test_func1():
    print('-----func1 called-----')
def test_func2(arg1, arg2):
    print('-----func2 called-----')
    print('arg1:', arg1, 'arg2:', arg2)
    print()
    return "func2"
def test_func3(arg1, arg2):
    print('-----func3 called-----')
    print('arg1:', arg1, 'arg2:', arg2)
    print()
    return 999
def test_func4(arg1, arg2):
    print('-----func4 called-----')
    print('arg1:', arg1, 'arg2:', arg2)
    print()
    return 9.99
def test_func5(arg1, arg2):
    print('-----func5 called-----')
    print('arg1:', arg1, 'arg2:', arg2)
    print()
    return ['e1', 'e2']
def test_func6(arg1, arg2):
    print('-----func6 called-----')
    print('arg1:', arg1, 'arg2:', arg2)
    print()
    return False
def test_func7(*args, **kwargs):
    print('-----func7 called-----')
    for i, arg in enumerate(args):
        print('arg%s = %s' % (i, arg))
    for i, kwargs in enumerate(kwargs):
        print('kwarg%s = ' % i, kwargs)
user_name = 'shouke'
addr = 'unknown'
int_var = 3
def evaluate_dynamic_value(dynamic_value):
    '''解析動(dòng)態(tài)值
    @params: dynamic_value 動(dòng)態(tài)值,如果是字符串類型,帶雙引號(hào)、單引號(hào)
    '''
    if REGEX_PATTERN_FOR_VAR.search(dynamic_value):
        pattern = REGEX_PATTERN_FOR_VAR
    elif REGEX_PATTERN_FOR_FUNC_DEFINITION.search(dynamic_value):
        pattern = REGEX_PATTERN_FOR_FUNC_DEFINITION
    else:
        return dynamic_value
    var_express_value = None
    match_res = pattern.findall(dynamic_value)
    for var_express in match_res:
        var_name = var_express[2:-1].strip()
        if var_name.startswith('__'): # 函數(shù)
            function_mateched = REGEX_PATTERN_FOR_FUNC_DEFINITION.findall(var_express)
            for function in function_mateched:
                func_info_matched = REGEX_PATTERN_FOR_FUNC_NAME_WITH_ARGS.findall(var_express)
                for func_info in func_info_matched:
                    func_name, func_args = func_info
                    # print('---',func_name, func_args)
                    if REGEX_PATTERN_FOR_DYNAMIC.search(func_args):
                        func_args = evaluate_dynamic_value(func_args)
                    func_value = eval('{func_name}({func_args})'.format(func_name=func_name.lstrip('_'), func_args=func_args))
                    if func_value is None:
                        func_value = ''
                    var_express_value = var_express.replace(function, str(func_value))
        else: # 變量,不支持嵌套,直接取值
            var_express_value = globals().get(var_name, '')
        if var_express_value is not None:
            dynamic_value = dynamic_value.replace(var_express, str(var_express_value))
            if REGEX_PATTERN_FOR_DYNAMIC.search(dynamic_value): # 替換后的動(dòng)態(tài)值,還是可能存在動(dòng)態(tài)值
                dynamic_value = evaluate_dynamic_value(dynamic_value)
    return dynamic_value
# 測(cè)試驗(yàn)證
print(evaluate_dynamic_value('${ user_name }')) # 輸出:shouke
print(evaluate_dynamic_value('${ addr }')) # 輸出:unknown
print(evaluate_dynamic_value('username:${ user_name } addr:${ addr }')) # 輸出:username:shouke addr:unknown
print(evaluate_dynamic_value('${ __test_func1() }'))
#調(diào)用輸出:
#-----func1 called-----
print(evaluate_dynamic_value('${ __test_func2("user", "shouke") }')) # 輸出:func2
#調(diào)用輸出:
#-----func2 called-----
# arg1: user arg2: shouke
#
print(evaluate_dynamic_value('test_func1 return: ${ __test_func1() }, test_func2 return: ${ __test_func2("user", "shouke") }')) # 輸出:test_func1 return: , test_func2 return: func2
# 調(diào)用輸出:
#-----func1 called-----
#-----func2 called-----
#arg1: user arg2: shouke
#
print(evaluate_dynamic_value('${ __test_func7("addr", "sz") }'))
#-----func7 called-----
#調(diào)用輸出:
#arg0 = addr
#arg1 = sz
print(evaluate_dynamic_value('${ __test_func7(110,'
                             ' 11.56, '
                             '"test", '
                             '[1, 3, 5], '
                             '["2", "4", "6"], '
                             '1 == 1, '
                             'True, '
                             '{"username": "shouke", "age": "unknown"},'
                             'position="sz",'
                             'hobby="pingpong",'
                             'books=["unkonwn"]) }'))
#調(diào)用輸出:
# -----func7 called-----
# arg0 = 110
# arg1 = 11.56
# arg2 = test
# arg3 = [1, 3, 5]
# arg4 = ['2', '4', '6']
# arg5 = True
# arg6 = True
# arg7 = {'username': 'shouke', 'age': 'unknown'}
# kwarg0 =  position
# kwarg1 =  hobby
# kwarg2 =  books
print(evaluate_dynamic_value('${ __test_func7("${user_name}", ${int_var})}'))
#調(diào)用輸出:
#-----func7 called-----
#arg0 = shouke
#arg1 = 3
print(evaluate_dynamic_value('var: ${addr} function: ${ __test_func7( ${__test_func6("${user_name}", ${int_var})}, ${__test_func5( ${__test_func4("${int_var}", "func4")}, ${__test_func3(\'${__test_func2("func2", True)}\', \'func3\')} )})}')) # 返回 var: unknown function:
#調(diào)用輸出:
#-----func6 called-----
#arg1: shouke arg2: 3
#
#-----func4 called-----
#arg1: 3 arg2: func4
#
#-----func2 called-----
#arg1: func2 arg2: True
#
#-----func3 called-----
#arg1: func2 arg2: func3
#
#-----func5 called-----
#arg1: 9.99 arg2: 999
#
#-----func7 called-----
#arg0 = False
#arg1 = ['e1', 'e2']
#-----func2 called-----
#arg1: func2 arg2: True
#
#-----func4 called-----
#arg1: 3 arg2: func4
#
#-----func2 called-----
#arg1: func2 arg2: True
#
#-----func2 called-----
#arg1: func2 arg2: True
#
#-----func2 called-----
#arg1: func2 arg2: True
#
#-----func2 called-----
#arg1: func2 arg2: True
#
print(evaluate_dynamic_value('${ __test_func7(set([1, 2, 3]))}'))
#調(diào)用輸出:
# -----func7 called-----
# arg0 = {1, 2, 3}

到此這篇關(guān)于Python 按規(guī)則解析并替換字符串中的變量及函數(shù)的文章就介紹到這了,更多相關(guān)Python 替換字符串變量及函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • django celery redis使用具體實(shí)踐

    django celery redis使用具體實(shí)踐

    這篇文章主要介紹了django celery redis使用具體實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • pandas通過(guò)字典生成dataframe的方法步驟

    pandas通過(guò)字典生成dataframe的方法步驟

    這篇文章主要介紹了pandas通過(guò)字典生成dataframe的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • PyTorch平方根報(bào)錯(cuò)的處理方案

    PyTorch平方根報(bào)錯(cuò)的處理方案

    這篇文章主要介紹了PyTorch平方根報(bào)錯(cuò)的處理方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • PyCharm Terminal終端命令行Shell設(shè)置方式

    PyCharm Terminal終端命令行Shell設(shè)置方式

    這篇文章主要介紹了PyCharm Terminal終端命令行Shell設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Ubuntu安裝PySide6開(kāi)發(fā)桌面應(yīng)用實(shí)踐

    Ubuntu安裝PySide6開(kāi)發(fā)桌面應(yīng)用實(shí)踐

    文章介紹了在Ubuntu非桌面端安裝PySide6并使用WSL2在Windows上開(kāi)發(fā)Python桌面應(yīng)用的全過(guò)程,首先,通過(guò)wS安裝基礎(chǔ)工具并用使用pip安裝PySide6,接著,在WindowsD安裝VSCode并配置WSL支持支持GUI顯示,最后D在WSL中開(kāi)發(fā)Python桌面應(yīng)用
    2026-04-04
  • Pandas DataFrame 取一行數(shù)據(jù)會(huì)得到Series的方法

    Pandas DataFrame 取一行數(shù)據(jù)會(huì)得到Series的方法

    今天小編就為大家分享一篇Pandas DataFrame 取一行數(shù)據(jù)會(huì)得到Series的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • pytorch多GPU并行運(yùn)算的實(shí)現(xiàn)

    pytorch多GPU并行運(yùn)算的實(shí)現(xiàn)

    這篇文章主要介紹了pytorch多GPU并行運(yùn)算的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Python文件時(shí)間操作步驟代碼詳解

    Python文件時(shí)間操作步驟代碼詳解

    這篇文章主要介紹了Python文件時(shí)間操作步驟代碼詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Pandas?合并數(shù)據(jù)集merge?和?join的使用

    Pandas?合并數(shù)據(jù)集merge?和?join的使用

    Pandas?提供了一個(gè)重要的功能,即高性能的內(nèi)存中連接(join)和合并(merge)操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-06-06
  • 詳解python中GPU版本的opencv常用方法介紹

    詳解python中GPU版本的opencv常用方法介紹

    這篇文章主要介紹了詳解python中GPU版本的opencv常用方法介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評(píng)論

秭归县| 西昌市| 花垣县| 且末县| 库伦旗| 永吉县| 利辛县| 铜梁县| 临沧市| 墨脱县| 扎兰屯市| 乌兰察布市| 鲜城| 通辽市| 东宁县| 苗栗县| 文化| 广河县| 尼玛县| 正宁县| 孟连| 焦作市| 云南省| 沭阳县| 白山市| 郓城县| 英山县| 龙井市| 阜新| 高密市| 峨山| 黑龙江省| 许昌县| 定兴县| 庄河市| 彭泽县| 陕西省| 四川省| 资源县| 新建县| 高平市|