国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價(jià)值的文章主要介紹了Python 按規(guī)則解析并替換字符串中的變量及函數(shù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

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

需求

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

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

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

注意:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-746841.html

  1. 函數(shù)名稱以__打頭
  2. ${ 之間不能有空格
  3. 函數(shù)名稱和函數(shù)的左括號(hào) ( 之間不能有空隔
  4. 函數(shù)支持嵌套,形如:${ __function1( ${__function2()} )}
  5. 函數(shù)參數(shù)如果是字符串(包括由嵌套函數(shù)返回值),需要使用單引號(hào)、雙引號(hào)引用 形如 ${ __function1( "str_value", 123)} ,${ __function1(key="arg_value")},${ __function1(key=\'arg_value\')},
  6. 函數(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ù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • chatgpt賦能python:Python中如何取出字符串中的數(shù)字并賦予新的變量

    在 Python 中,我們經(jīng)常需要處理字符串,其中可能包含多種類型的數(shù)據(jù)。當(dāng)我們需要獲取字符串中的數(shù)字時(shí),該怎樣做呢?本文將介紹取出字符串中的數(shù)字的方法,并賦予新的變量,以便后續(xù)使用。 第一種方法是使用循環(huán)遍歷字符串,將字符串中的每個(gè)字符逐一比較,如果是

    2024年02月08日
    瀏覽(25)
  • 【833. 字符串中的查找與替換】

    【833. 字符串中的查找與替換】

    來(lái)源:力扣(LeetCode) 描述: 你會(huì)得到一個(gè)字符串 s (索引從 0 開(kāi)始),你必須對(duì)它執(zhí)行 k 個(gè)替換操作。替換操作以三個(gè)長(zhǎng)度均為 k 的并行數(shù)組給出: indices , sources , targets 。 要完成第 i 個(gè)替換操作: 檢查 子字符串 sources[i] 是否出現(xiàn)在 原字符串 s 的索引 indices[i] 處。 如果沒(méi)有

    2024年02月13日
    瀏覽(25)
  • LeetCode 0833. 字符串中的查找與替換

    力扣題目鏈接:https://leetcode.cn/problems/find-and-replace-in-string/ 你會(huì)得到一個(gè)字符串 s ?(索引從 0 開(kāi)始),你必須對(duì)它執(zhí)行 k 個(gè)替換操作。替換操作以三個(gè)長(zhǎng)度均為 k 的并行數(shù)組給出: indices ,? sources ,?? targets 。 要完成第 i 個(gè)替換操作: 檢查 子字符串 ? sources[i] ?是否出現(xiàn)在 原字

    2024年02月12日
    瀏覽(16)
  • 【代碼隨想錄 | Leetcode | 第十一天】字符串 | 反轉(zhuǎn)字符串 | 反轉(zhuǎn)字符串 II | 替換空格 | 反轉(zhuǎn)字符串中的單詞 | 左旋轉(zhuǎn)字符串

    【代碼隨想錄 | Leetcode | 第十一天】字符串 | 反轉(zhuǎn)字符串 | 反轉(zhuǎn)字符串 II | 替換空格 | 反轉(zhuǎn)字符串中的單詞 | 左旋轉(zhuǎn)字符串

    歡迎來(lái)到小K的Leetcode|代碼隨想錄|專題化專欄,今天將為大家?guī)?lái)字符串~反轉(zhuǎn)字符串 | 反轉(zhuǎn)字符串 II | 替換空格 | 反轉(zhuǎn)字符串中的單詞 | 左旋轉(zhuǎn)字符串的分享 ? ?題目鏈接點(diǎn)這里 編寫(xiě)一個(gè)函數(shù),其作用是將輸入的字符串反轉(zhuǎn)過(guò)來(lái)。輸入字符串以字符數(shù)組 s 的形式給出。不要

    2024年02月15日
    瀏覽(54)
  • C++string類replace()函數(shù)(替換字符串中的子串)

    C++中的string類提供了replace()函數(shù),用于替換字符串中的子串。其函數(shù)原型如下: 其中,pos表示要替換的子串在原字符串中的起始位置,len表示要替換的子串的長(zhǎng)度,str表示用來(lái)替換的字符串。 replace()函數(shù)的使用方法非常簡(jiǎn)單,只需要傳入要替換的子串的位置、長(zhǎng)度和替換字

    2024年02月05日
    瀏覽(27)
  • Python字符串替換的3種方法

    Python字符串替換筆記主要展示了如何在Python中替換字符串。Python中有以下幾種替換字符串的方法,本文主要介紹前三種。 replace方法(常用) translate方法 re.sub方法 字符串切片(根據(jù)Python字符串切片方法替換字符) Python replace方法把字符串中的old(舊字符串) 替換成new(新字符

    2024年02月05日
    瀏覽(27)
  • 替換空格&&反轉(zhuǎn)字符串中的單詞(LeetCode 劍指offer05 && 151)

    題目 劍指 Offer 05. 替換空格? 思路 遍歷,使用新的字符串來(lái)接原字符串,如為空格,則加入%20,否則加入原字符串。? 不過(guò)看了題解有另一種解法,由于空格轉(zhuǎn)化為%20,設(shè)計(jì)到原字符存儲(chǔ)空間的增加,因此先計(jì)算出需要增加的空間后。再使用雙指針,從后往前遍歷,這里畫(huà)的

    2024年02月16日
    瀏覽(19)
  • 2023-08-15 LeetCode每日一題(字符串中的查找與替換)

    點(diǎn)擊跳轉(zhuǎn)到題目位置 你會(huì)得到一個(gè)字符串 s (索引從 0 開(kāi)始),你必須對(duì)它執(zhí)行 k 個(gè)替換操作。替換操作以三個(gè)長(zhǎng)度均為 k 的并行數(shù)組給出:indices, sources, targets。 要完成第 i 個(gè)替換操作: 檢查 子字符串 sources[i] 是否出現(xiàn)在 原字符串 s 的索引 indices[i] 處。 如果沒(méi)有出現(xiàn), 什么

    2024年02月12日
    瀏覽(20)
  • Python replace()函數(shù)使用詳解,Python替換字符串

    Python replace()函數(shù)使用詳解,Python替換字符串

    「作者主頁(yè)」: 士別三日wyx 「作者簡(jiǎn)介」: CSDN top100、阿里云博客專家、華為云享專家、網(wǎng)絡(luò)安全領(lǐng)域優(yōu)質(zhì)創(chuàng)作者 「推薦專欄」: 小白零基礎(chǔ)《Python入門(mén)到精通》 replace() 可以 「替換」 字符串中的內(nèi)容 語(yǔ)法 參數(shù) old :(必選,字符串類型)被替換的字符串 new :(必選,

    2024年02月16日
    瀏覽(23)
  • vue實(shí)現(xiàn)把字符串中的所有@內(nèi)容,替換成帶標(biāo)簽的

    前言: ? ? ? ? 目前有個(gè)需求是,要把輸入框里面的@還有姓名高亮。 要求: 1、必須用 v-html ,帶標(biāo)簽的給他渲染 2、把字符串中的@全部查找出來(lái),替換掉,注意要過(guò)濾已經(jīng)替換好的,不然就是無(wú)限循環(huán)了 實(shí)現(xiàn)方法:

    2024年02月11日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包