2015-07-12 52 views
3

有兩種命名組在我的模式:myFlagID,我想馬上組ID前多加一個myFlagPython的逆向引用替換爲預期不起作用

這裏是我當前的代碼:

# i'm using Python 3.4.2 
import re 
import os 
contents = b''' 
xdlg::xdlg(x_app* pApp, CWnd* pParent) 
    : customized_dlg((UINT)0, pParent, pApp) 
    , m_pReaderApp(pApp) 
    , m_info(pApp) 
{ 

} 
''' 

pattern = rb'(?P<myFlag>[a-zA-Z0-9_]+)::(?P=myFlag).+:.+(?P<id>\(UINT\)0 *,)' 
res = re.search(pattern, contents, re.DOTALL) 
if None != res: 
    print(res.groups()) # the output is (b'xdlg', b'(UINT)0,') 

# 'replPattern' becomes b'(?P<myFlag>[a-zA-Z0-9_]+)::(?P=myFlag).+:.+((?P=myFlag)\\(UINT\\)0 *,)' 
replPattern = pattern.replace(b'?P<id>', b'(?P=myFlag)', re.DOTALL) 
print(replPattern) 
contents = re.sub(pattern, replPattern, contents) 
print(contents) 

預期的結果應該是:

xdlg::xdlg(x_app* pApp, CWnd* pParent) 
    : customized_dlg(xdlg(UINT)0, pParent, pApp) 
    , m_pReaderApp(pApp) 
    , m_info(pApp) 
{ 

} 

但現在的結果。這與原來一樣:

xdlg::xdlg(x_app* pApp, CWnd* pParent) 
    : customized_dlg((UINT)0, pParent, pApp) 
    , m_pReaderApp(pApp) 
    , m_info(pApp) 
{ 

} 
+0

你爲什麼用'(?P = myFlag)'(帶有parens)替換'?P '(無parens)? –

+0

此外,輸入中沒有第三個'xdlg'字符串。你究竟想在這裏完成什麼? –

+0

,因爲我想用'myFlag'組替換字符串,所以必須將它們與parens一起使用(Python語法) –

回答

2

問題似乎是模式語法 - 特別是結尾:

0 *,)

這是沒有意義真的...固定它似乎解決大部分的問題,但我會建議拋棄DOTALLMULTILINE去代替:

p = re.compile(ur'([a-zA-Z0-9_]+)::\1(.*\n\W+:.*)(\(UINT\)0,.*)', re.MULTILINE) 
sub = u"\\1::\\1\\2\\1\\3" 
result = re.sub(p, sub, s) 

print(result) 

結果:

xdlg::xdlg(x_app* pApp, CWnd* pParent) 
    : customized_dlg(xdlg(UINT)0, pParent, pApp) 
    , m_pReaderApp(pApp) 
    , m_info(pApp) 
{ 

} 

https://regex101.com/r/hG3lV7/1

+0

我曾嘗試過你的模式,它確實有效。然而,我很困惑,是否有必要引入5組?用兩組解決這個問題是否可行? –

+1

沒有五個小組沒有必要(請參閱編輯),儘管我無法完全理解您所擁有的。在我看來,'Python'中的命名組沒有什麼價值,除非你有許多組需要跟蹤多個替換等。否則,它只是更多的代碼,使事情變得更加混亂。 –

+0

沒有結尾'。*',它仍然可以工作 –