我需要能夠在模式匹配陳述句中以匹配的模式作為引數呼叫函式,并使用函式的回傳結果作為匹配模式的替換。在 perl 中,可以使用eval函式來做到這一點。下面是 perl 示例:
test =~ s/(>?,)(\d )/eval q{&sum($1,$2)}/ge;
我怎樣才能在 Python 中做到這一點。謝謝你的幫助。
uj5u.com熱心網友回復:
Python 與 Perl 的平行eval EXPR也被命名為eval.
更加具體,
eval( $code )
相當于
DOLLAR_AT = None # Global var $@
def perl_eval( code ):
try:
DOLLAR_AT = None
return eval( code )
catch BaseException as err:
DOLLAR_AT = err
perl_eval( code )
但您實際上是在詢問/e. 這就是允許替換運算式成為 Perl 運算式的原因。在 Python 中,可以通過為re.sub的第二個引數傳遞一個函式來實作類似的結果。
$test =~ s/(\d )\ (\d )/ $1 $2 /eg;
相當于
test = re.sub( r"(\d )\ (\d )", lambda _: str( int( _.group(1) ) int( _.group(2) ) ), test )
現在,讓我們看看您發布的代碼。我們不關心$@這里,所以 Python 等價于
$test =~ s/(>?,)(\d )/ eval q{sum( $1, $2 )} /ge;
是
import re
def replacer( match ):
try:
return eval( "sum(" match.group(1) ", " match.group(2) ")" )
except:
return None
test = re.sub( r"(>?,)(\d )", replacer, test )
[缺失:當替換運算式回傳時,Perl 片段會發出警告None。]
也就是說,這種使用eval是完全錯誤的。
因為sum(>,123)不是有效的 Perl,所以 Perl 片段等價于
$test =~ s/(>)?,(\d )/ defined( $1 ) ? undef : eval { sum( $2 ) } /ge;
或者
import re
def replacer( match ):
if match.group(1) is None:
return None
else
try:
return sum( match.group(2) )
except:
return None
test = re.sub( r"(>)?,(\d )", replacer, test )
[缺失:當替換運算式回傳時,Perl 片段會發出警告None。]
[Python 的并行eval BLOCK是try.]
這完全沒有意義。以下可能更接近作者的意圖:
$test =~ s/(>?,)(\d )/ sum( $1, $2 ) /ge;
或者
import re
test = re.sub( r"(>?,)(\d )", lambda _ : sum( _.group(1), _.group(2) ), test )
可能不是這樣。傳遞>,或傳遞,給一個名為的子sum似乎不正確。但是在不知道sum該片段應該做什么以及應該做什么的情況下,我無法進一步評論。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/506252.html
上一篇:如何獲取陣列中最大元素的索引?
