Python 为什么这个正则表达式替代了原始正则表达式?

Python 为什么这个正则表达式替代了原始正则表达式?,python,regex,Python,Regex,我正在尝试使用re.sub将此文件中所有不同的B2Ab组合替换为本例中的B2Az。find部分工作得很好,但每次我进行替换时,它都会替换原始正则表达式。我显然错过了一些非常简单的东西,但却找不到它是什么 这是我正在分析的文件的一个片段: <t:ION t:SA="ModuleObj" t:H="2058" t:P="132" t:N="Data Rec 11" t:CI="DataRecorder_Module" t:L="GENB2AbE" t:S

我正在尝试使用re.sub将此文件中所有不同的B2Ab组合替换为本例中的B2Az。find部分工作得很好,但每次我进行替换时,它都会替换原始正则表达式。我显然错过了一些非常简单的东西,但却找不到它是什么

这是我正在分析的文件的一个片段:

                    <t:ION t:SA="ModuleObj" t:H="2058" t:P="132" t:N="Data Rec 11" t:CI="DataRecorder_Module" t:L="GENB2AbE" t:S="1" t:SC="5">
                                                    <t:ION t:SA="RegisterObj" t:H="3978" t:P="2058" t:N="RE11 Data Log" t:CI="Log_Register" t:L="GENB2Ab">
                                                                            <t:ION t:SA="ModuleObj" t:H="2059" t:P="132" t:N="Data Rec 12" t:CI="DataRecorder_Module" t:L="B2Ab2SBrkr" t:S="1" t:SC="5">
                        <t:IH>
                            <t:CH t:H="43715">
                            </t:CH>
    <t:ION t:SA="ModuleObj" t:H="2058" t:P="132" t:N="Data Rec 11" t:CI="DataRecorder_Module" t:L="PMDC_B2_A_b_E" t:S="1" t:SC="5">
    <t:IH>
                            <t:CH t:H="43715">
                            </t:CH>
    <t:ION t:SA="ModuleObj" t:H="2058" t:P="132" t:N="Data Rec 11" t:CI="DataRecorder_Module" t:L="PMDC-B2-A-b_E" t:S="1" t:SC="5">
这是我从上述代码中得到的输出:

 Found on line 1: ('B2Ab',)
 <t:ION t:SA="ModuleObj" t:H="2058" t:P="132" t:N="Data Rec 11" t:CI="DataRecorder_Module" t:L="GEN[_-]?[B][_-]?[2][_-]?[A][_-]?[z][_-]?E" t:S="1" t:SC="5">
 Found on line 1: ('B2Ab',)
 <t:ION t:SA="RegisterObj" t:H="3978" t:P="2058" t:N="RE11 Data Log" t:CI="Log_Register" t:L="GEN[_-]?[B][_-]?[2][_-]?[A][_-]?[z][_-]?">
 Found on line 1: ('B2Ab',)
 <t:ION t:SA="ModuleObj" t:H="2059" t:P="132" t:N="Data Rec 12" t:CI="DataRecorder_Module" t:L="[_-]?[B][_-]?[2][_-]?[A][_-]?[z][_-]?2SBrkr" t:S="1" t:SC="5">
 Found on line 1: ('_B2_A_b_',)
 <t:ION t:SA="ModuleObj" t:H="2058" t:P="132" t:N="Data Rec 11" t:CI="DataRecorder_Module" t:L="PMDC[_-]?[B][_-]?[2][_-]?[A][_-]?[z][_-]?E" t:S="1" t:SC="5">
 Found on line 1: ('-B2-A-b_',)
 <t:ION t:SA="ModuleObj" t:H="2058" t:P="132" t:N="Data Rec 11" t:CI="DataRecorder_Module" t:L="PMDC[_-]?[B][_-]?[2][_-]?[A][_-]?[z][_-]?E" t:S="1" t:SC="5">
在第1行找到:('B2Ab',)
在第1行找到:('B2Ab',)
在第1行找到:('B2Ab',)
在第1行中找到:(“uB2\uA\uB”,)
在第1行找到:('-B2-A-b_',)
我应该得到这个:

 Found on line 1: ('B2Ab',)
 <t:ION t:SA="ModuleObj" t:H="2058" t:P="132" t:N="Data Rec 11" t:CI="DataRecorder_Module" t:L="GENB2AzE" t:S="1" t:SC="5">
 Found on line 1: ('B2Ab',)
 <t:ION t:SA="RegisterObj" t:H="3978" t:P="2058" t:N="RE11 Data Log" t:CI="Log_Register" t:L="GENB2Az">
 Found on line 1: ('B2Ab',)
 <t:ION t:SA="ModuleObj" t:H="2059" t:P="132" t:N="Data Rec 12" t:CI="DataRecorder_Module" t:L="B2Az2SBrkr" t:S="1" t:SC="5">
 Found on line 1: ('_B2_A_b_',)
 <t:ION t:SA="ModuleObj" t:H="2058" t:P="132" t:N="Data Rec 11" t:CI="DataRecorder_Module" t:L="PMDC_B2_A_z_E" t:S="1" t:SC="5">
 Found on line 1: ('-B2-A-b_',)
 <t:ION t:SA="ModuleObj" t:H="2058" t:P="132" t:N="Data Rec 11" t:CI="DataRecorder_Module" t:L="PMDC_B2_A_z_E" t:S="1" t:SC="5">
在第1行找到:('B2Ab',)
在第1行找到:('B2Ab',)
在第1行找到:('B2Ab',)
在第1行中找到:(“uB2\uA\uB”,)
在第1行找到:('-B2-A-b_',)

提前感谢您对我缺少的内容提出的建议。

您需要定义自己的替换函数

def repl(matchobj):
     return varl1+varl2+varl3+valr4

line = re.sub(r'[_-]?['+varl1+'][_-]?['+varl2+'][_-]?['+varl3+'][_-]?['+varl4+'][_-]?',repl, line.rstrip())

类似的东西。在函数中,你可以返回任何你想要的东西。

替换不是一种模式。它唯一的特点是用捕获组内容替换序列
\1
\2
等。因此,您无法匹配替换零件中的下划线和破折号;您想从模式中复制它们

pattern = re.compile('([_-]?'+varl1+'[_-]?'+varl2+'[_-]?'+varl3+'[_-]?)'+varl4+'([_-]?)')
re.sub(pattern, r'\1' + varlr + r'\2', line.rstrip())

例如在
“PMDC_B2_A_b_e”
上,这将分别捕获
“_B2_A_
“_
\1
\2
中,然后在替换中恢复它们,中间夹有
z
,用于最终的
\u B2_ _ _
替换,使最后的字符串
“PMDC_B2 A_ _

因为这就是你告诉它对
re.sub
的第二个参数所做的。这仍然提供了奇怪的
[\u-]?
替代物-而不是OP想要的。请看“我应该得到这个”@Jerry我说过类似的话……这样他就可以根据自己的想法进行修改wish@vks以这种速度,OP将不得不修改所有内容。我看不出这有什么帮助。
pattern = re.compile('([_-]?'+varl1+'[_-]?'+varl2+'[_-]?'+varl3+'[_-]?)'+varl4+'([_-]?)')
re.sub(pattern, r'\1' + varlr + r'\2', line.rstrip())