<p>我找到了一个解决方案,我在regex中尝试了re.finditer(),它正如期工作。请找到我的代码,如果有比这更好的方法,请告诉我。我要谢谢大家</p>
<p>代码:</p>
<pre><code>import re
from collections import defaultdict
dict2=defaultdict(list)
dict3=defaultdict(list)
dict1=defaultdict(list)
pattern="QWL"
rd_case= "Digital"
setup_temp = "0C"
readout_temp = "0C"
address=[]
def tde_file():
with open(r'C:\Gert_batch file\DOE_parsing\Thebe\DOE 4 - 5K\NEW SFR\PF\tde\MRB_QWL_0c_Digital_PS60c_TC1798.tde', 'rb') as f:
for line in f:
pattern_tde = ":TEST_RESULT"
if pattern_tde in line:
tde_addr = ':TEST_RESULT (\d+); addr: ([0-9A-Za-z]{10})'
x0 =re.match(tde_addr, line)
if x0:
address_tde = x0.group(2)
tde_addr_1 = 'cfp_(vqs|vcs)_m(\d+) \// HB05_SB255'
x1 = re.search(tde_addr_1,line)
tde_addr_2 = 'cfp_(vqs|vcs)_m\dm\d_(vth\d.\d) \// HB05_SB255'
x2 = re.search(tde_addr_2,line)
tde_addrs_1 = '(DTS_)value_(before|after)_test_(start|finish)'
y0 = re.search(tde_addrs_1,line)
if x1:
hlp_s = x1.group(2).zfill(2)
identifier = x1.group(1)+"_m"+hlp_s
if x2:
identifier = x2.group(1)+"_m"+x2.group(2)
try:
tde_addr_3 = '(SBE|DBE)|(Number of (\ds) bit fail) \// HB05_SB255'
hlp_s = re.search(tde_addr_3,line).group(1)
if hlp_s:
dict1[pattern,rd_case,address_tde]=identifier+"_"+hlp_s
except AttributeError:pass
try:
tde_addr_3 = '(SBE|DBE)|(Number of (\ds) bit fail) \// HB05_SB255'
hlp_s = re.search(tde_addr_3,line).group(3)
if hlp_s:
dict1[pattern,rd_case,address_tde]=identifier+"_"+hlp_s
except AttributeError: pass
try:
if y0.group(1) and y0.group(3):
dict1[pattern,rd_case,address_tde]=y0.group(1)+y0.group(3)+"_temp"
except AttributeError: pass
def evaluate_lot_wxy(trf_dev_id_pattern):
import re
binary_value = ""
dev_id_status = False
line = trf_dev_id_pattern
dev_id = 'Device ID: ([0-9a-zA-Z]{10}) ([0-9a-zA-Z]{10}) ([0-9a-zA-Z]{10}) ([0-9a-zA-Z]{10})$'
hex_inp1 = re.search(dev_id,line)
#print hex_inp1.group()
hex_inp2 = hex_inp1.group(4)+hex_inp1.group(3)+hex_inp1.group(2)+hex_inp1.group(1)
hex_inp3 = re.sub('0x', '', hex_inp2)
#print hex_inp3
for i,val in enumerate(str(hex_inp3)):
binary_value1=str(bin(int(val,16))[2:]).zfill(4)
binary_value = str(binary_value) + str(binary_value1)
#print binary_value
wafer_val = binary_value[90:96]
wafer = int(wafer_val,2)
y_pos_val = binary_value[106:113]
y_pos = int(y_pos_val,2)
x_pos_val = binary_value[98:105]
x_pos = int(x_pos_val,2)
year_val = binary_value[63:67]
year = int(year_val,2)
production_week_val = binary_value[67:73]
production_week = int(production_week_val,2)
serial_no_val = binary_value[73:83]
serial_no=int(serial_no_val,2)
lot ="ZA"+str(year)+str(production_week)+str(serial_no)
if (1 <= wafer <= 25) and (1<= x_pos <= 65) and (1 <= y_pos <= 65):
dev_id_status = True
return lot,wafer,x_pos,y_pos,dev_id_status
tde_file()
with open(r"C:\Gert_batch file\DOE_parsing\Thebe\DOE 4 - 5K\NEW SFR\PF\1k Cycling\Results_452_13384\Result Files\452_20170111_021021_TC1798_MRB_QWL_0c_Digital_PS60c_1021002999.trf") as f1:
lines = f1.read()
socket_position_status = False
dev_id_status = False
CB_noS_status = False
trf_val_flag = False
for m in re.finditer(r'Socket:(.*?)ART: 0xB00017EC DRT: 0x00000000\n', lines,flags=re.DOTALL):
x1 = ('%s' % (m.group(0)))
for line in x1.splitlines():
if "Socket:" in line:
trf_addr = 'Socket: (\d+)$'
x0 =re.match(trf_addr, line)
try:
if x0.group(1).zfill(3):
socket_position = x0.group(1).zfill(3)
socket_position_status = True
#print socket_position
except AttributeError: pass
elif "Device ID:" in line:
dev_id = 'Device ID: ([0-9a-zA-Z]{10}) ([0-9a-zA-Z]{10}) ([0-9a-zA-Z]{10}) ([0-9a-zA-Z]{10})$'
x1 = re.search(dev_id,line)
try:
if x1.group(1) and x1.group(1) and x1.group(1) and x1.group(1):
trf_dev_id_pattern = x1.group()#x1.group(4)+x1.group(3)+x1.group(2)+x1.group(1)
lot_wafer_x_y = evaluate_lot_wxy(trf_dev_id_pattern)
dev_id_status = lot_wafer_x_y[4]
#print lot_wafer_x_y
except AttributeError: pass
elif "CB:" in line:
CB_pat = 'CB: (\d+)\/'
x2 = re.search(CB_pat,line)
try:
if x2.group(1):
CB_no = x2.group(1)
CB_noS_status = True
#print CB_noS_status
except AttributeError: pass
elif"ART:" in line:
regex = re.search("ART: ([0-9A-Za-z]{10}) DRT: ([0-9A-Za-z]{10}$)",line)
#print line
try:
if regex.group(1) and regex.group(2):
for key1,val1 in dict1.iteritems():
if regex.group(1) in key1:
#print "Address:"+regex.group(1)
hlp_a = val1
hlp_b = hlp_a.split("_")
identifier = hlp_b[0]
fail_class = hlp_b[1]
key_addtional = hlp_b[2]
val = regex.group(2)
value = int(val[3:],16)
trf_val_flag = True
if dev_id_status and trf_val_flag and CB_noS_status:
dict3[rd_case,pattern,setup_temp,readout_temp,CB_no,socket_position,fail_class,identifier,key_addtional]= value
continue
except AttributeError: pass
#elif socket_position_status and dev_id_status and CB_noS_status and trf_val_flag:
#dict3[rd_case,pattern,setup_temp,readout_temp,socket_position,fail_class,identifier]= value
print len(dict3.keys())
</code></pre>