2015-04-21 97 views
1

我試圖運行在我的C#/ IronPython的以下內容:如何解決IronPython編譯()問題?

import re 
Message = re.sub(r"^EVN\|A\d+", "EVN|A08", Message, flags=MULTILINE) 

這部作品在命令提示符下真正的蟒蛇精。但是,一旦我把它改成IronPython的我得到一個錯誤:

IronPython.Runtime.PythonContext.InvokeUnaryOperator(CodeContext context, UnaryOperators oper, Object target, String errorMsg)  
at IronPython.Runtime.Operations.PythonOps.Length(Object o)  
at IronPython.Modules.Builtin.len(Object o)  
at Microsoft.Scripting.Interpreter.FuncCallInstruction`2.Run(InterpretedFrame frame)  
at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)  
at Microsoft.Scripting.Interpreter.LightLambda.Run4[T0,T1,T2,T3,TRet](T0 arg0, T1 arg1, T2 arg2, T3 arg3)  
at System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2)  
at Microsoft.Scripting.Interpreter.DynamicInstruction`4.Run(InterpretedFrame frame)  
at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)  
at Microsoft.Scripting.Interpreter.LightLambda.Run2[T0,T1,TRet](T0 arg0, T1 arg1)  
at IronPython.Compiler.PythonScriptCode.RunWorker(CodeContext ctx)  
at IronPython.Compiler.PythonScriptCode.Run(Scope scope)  
at IronPython.Compiler.RuntimeScriptCode.InvokeTarget(Scope scope)  
at IronPython.Compiler.RuntimeScriptCode.Run(Scope scope)  
at Microsoft.Scripting.SourceUnit.Execute(Scope scope, ErrorSink errorSink)  
at Microsoft.Scripting.Hosting.ScriptSource.Execute(ScriptScope scope)  
at Microsoft.Scripting.Hosting.ScriptEngine.Execute(String expression, ScriptScope scope) 

研究使我明白(對還是錯?)的MULTILINE標誌觸發編譯()在IronPython的。然後我發現這篇文章是關於它在IronPython中缺乏支持:https://ironpython.codeplex.com/workitem/22692

刪除flags=MULTILINE修復了錯誤。但是,它不再匹配"^EVN"

編輯:如果我使用flags=re.MULTILINE我收到此錯誤:

ERROR Error while processing the message. Message: sub() got an unexpected keyword argument 'flags'. Microsoft.Scripting.ArgumentTypeException: sub() got an unexpected keyword argument 'flags' 

編輯完

我的問題是:我怎樣才能解決這個問題,仍然得到同樣的結果,我會得到在命令行給出了上面的代碼片段,但在IronPython中?

我很少使用Python,更不用說IronPython了,所以請原諒,因爲我不確定我的選擇。

+0

有一件事是在應用正則表達式之前用其他字符替換換行符,以便不再需要多行支持。 – kindall

+0

隨着're'的導入,它應該是're.MULTILINE',而不僅僅是'MULTILINE'。如果你是從C#調用它,或者不是你所有的Python代碼,那麼你是否有理由在IronPython中這麼做? – poke

+0

@poke re.MULTILINE沒有幫助。這是錯誤的「旗幟」說上述錯誤(我剛剛編輯了它的評論) –

回答

1

IronPython可能不支持re.sub中的flags關鍵字參數。要解決該問題,可以先編譯正則表達式。無論如何,如果您打算多次使用您的表達,建議您這麼做;無論如何,模塊級別的功能都可以。

爲此,請使用re.compile。該標誌可以作爲第二個參數進行傳遞:

regex = re.compile('^EVN\|A\d+', re.MULTILINE) 

這給你一個正則表達式對象,你可以直接使用其sub方法來執行你的更換:

你可以做
Message = regex.sub('EVN|A08', Message)