Python反向引用不';I don’我没有按预期工作

Python反向引用不';I don’我没有按预期工作,python,regex,replace,Python,Regex,Replace,在我的模式中有两个命名组:myFlag和id,我想在组id之前再添加一个myFlag 这是我目前的代码: # 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) { } '''

在我的模式中有两个命名组:myFlagid,我想在组id之前再添加一个myFlag

这是我目前的代码:

# 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((UINT)0, pParent, pApp)
    , m_pReaderApp(pApp)
    , m_info(pApp)
{

}

问题似乎在于模式语法,尤其是结尾:

0*,)

那真的没有意义。。。修复它似乎解决了大多数问题,尽管我建议放弃
DOTALL
,改为使用
MULTILINE

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)
{

}

为什么要用
(?p=myFlag)
(带参数)替换
?p
(无参数)?此外,输入中没有第三个
xdlg
字符串。你到底想在这里实现什么?因为我想用“myFlag”组替换字符串,所以必须用parens(python语法)将它们封装起来。这里的预期输出是什么?你想解决什么问题?你用反向引用替换了一个命名组的名称,正则表达式语法在这里没有任何意义。我试过你的模式,它确实有效。然而,我很困惑,有必要介绍5组吗?有可能用两个小组来解决这个问题吗?没有五个小组是不必要的(请参见编辑),尽管我也不能完全理解您的小组。在我看来,
Python
中的命名组有些毫无价值,除非您有许多组需要跨多个替换等进行跟踪。否则,更多的代码本质上会使事情变得更加混乱。这不是必需的,所以请将其删除。我认为模式也可以进一步改进-本例中的答案主要是为了说明它不起作用的原因。如何使用re.DOTALL实现相同的效果?
re.DOTALL
应该使用上述模式(仍然使用三个捕获组),尽管可以简化为类似
([a-zA-Z0-9\]+::\1(.*)(\(UINT\)0,.*)
xdlg::xdlg(x_app* pApp, CWnd* pParent)
    : customized_dlg(xdlg(UINT)0, pParent, pApp)
    , m_pReaderApp(pApp)
    , m_info(pApp)
{

}