我想用回复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">
这是我无数次尝试的最新一次:
var1 = 'B'
var2 = '2'
var3 = 'A'
var4 = 'b'
var5 = 'z'
fname = 'example.txt'
regexfind(fname,var1,var2,var3,var4,var5)
def regexfind(filename,varl1,varl2,varl3,varl4,varlr,):
pattern = re.compile('([_-]?['+varl1+'][_-]?['+varl2+'][_-]?['+varl3+'][_-]?['+varl4+'][_-]?)')
repl = re.compile('([_-]?['+varl1+'][_-]?['+varl2+'][_-]?['+varl3+'][_-]?['+varlr+'][_-]?)')
f = open(filename,'rb')
searchstrs = f.readlines()
i=0
for line in searchstrs:
for match in re.finditer(pattern, line):
print 'Found on line %s: %s' % (i+1, match.groups())
#Showing decompiled patterns for ease of explanation
line = re.sub(r'[_-]?['+varl1+'][_-]?['+varl2+'][_-]?['+varl3+'][_-]?['+varl4+'][_-]?',\
r'[_-]?['+varl1+'][_-]?['+varl2+'][_-]?['+varl3+'][_-]?['+varlr+'][_-]?', line.rstrip())
print(line)
这是我从上述代码得到的输出:
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">
我应该得到这个:
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
、\2
等。因此,您无法匹配替换零件中的下划线和破折号;您需要从模式中复制它们。你知道吗例如,在
"PMDC_B2_A_b_E"
上,这将分别将"_B2_A_
和"_"
捕获到\1
和\2
,然后将它们还原回替换中,z
夹在中间,用于最终的_B2_A_z_
替换,生成最终的字符串"PMDC_B2_A_z_E"
。你知道吗您需要定义自己的替换函数。你知道吗
差不多吧排序输入函数你可以返回你想要的任何东西。你知道吗
相关问题 更多 >
编程相关推荐