- UID
- 38867
- 阅读权限
- 80
- 注册时间
- 2010-1-23
- 最后登录
- 2021-9-10
- 在线时间
- 311 小时
- 性别
- 男
- 生日
- 1988 年 11 月 2 日
国王
- 耕战
- 933
- 鹰币
- 4
- 天龙币
- 0
- 回帖
- 249
|
楼主 |
发表于 2012-9-9 19:51:47
|
显示全部楼层
本帖最后由 tankant 于 2012-9-10 19:01 编辑
开始实现一些方法
#www.orayes.com########################################
#www.orayes.com########################################
#www.orayes.com########################################
#www.orayes.com########################################
#www.orayes.com########################################
#./t/public.py
#encoding:utf8
#公共方法
#设置测试字符串
#script = open ('./data').read()
#len_script=len(script)
###########################################
#方法1:定位第一个指定文本的位置
def first_fuhao(s,text,start,end):
fuhao=range(start,len(s))
for i in fuhao:
if s==text:
idx=i
break
else:
None
else:
idx=-1
return idx
#print '定位第一个(: '.decode("utf8"),first_fuhao(script,'(',0,len_script)
#################################################
#################################################
#方法2:定位所有指定文本的位置
#依赖方法1
def all_fuhao(s,text,start,end):
next_search=0
positions=[]
len_text=len(text)
while 1:
pos=first_fuhao(s,text,next_search,end)
if pos==-1:
break
positions.append(pos)
next_search=pos+len_text
return positions
#print '定位所有(: '.decode("utf8"),all_fuhao(script,'(',0,len_script)
#################################################
################################################
#方法3:定位第一个"对的位置
#依赖方法1
#前提是"必须是偶数个
def first_fenhao_pair(s,start,end):
pos1=first_fuhao(s,'"',start,end)
pos2=first_fuhao(s,'"',pos1+1,end)
return [pos1,pos2]
#pair=first_fenhao_pair(script,0,len_script)
#print '定位第一对": '.decode("utf8"),pair[0],pair[1]
#www.orayes.com########################################
#www.orayes.com########################################
#www.orayes.com########################################
#www.orayes.com########################################
#www.orayes.com########################################
#./read.py
#encoding:utf8
import sys
sys.path.append("./t")
import public
#测试字符串
cur_line='aasdf"afd"awe"as;df"asf'#假设这是脚本的一行
def abc(line):
########识别当前行分号和双引号哪个是有效的
len_line=len(line)
#定位第一个;的位置
first_fenhao=public.first_fuhao(cur_line,';',0,len_line)
#print 'first_fenhao ',first_fenhao
#定位第一个"的位置
first_yinhao=public.first_fuhao(cur_line,'"',0,len_line)
#print 'first_yinhao',first_yinhao
#定位所有"的位置
all_yinhao=public.all_fuhao(cur_line,'"',0,len_line)
#print 'all_yinhao',all_yinhao
#active_yinhao=all_yinhao#初始化有效"
active_yinhao=public.all_fuhao(line,'"',0,len_line)
#print 'active_yinhao',active_yinhao
#定位所有;的位置
all_fenhao=public.all_fuhao(line,';',0,len_line)
#print 'all_fenhao',all_fenhao
#active_yinhao=all_yinhao#初始化有效"
active_fenhao=public.all_fuhao(line,';',0,len_line)
start_pos=0
active_yinhao_pairs=[]
while 1:
#print '==========='
if first_fenhao==-1:
#print '没有注释'.decode("utf8")
#把有效引号序列变成有效引号对序列
len_active_yinhao=len(active_yinhao)
num=0
active_yinhao_pairs=[]
while num<len_active_yinhao:
active_yinhao_pairs.append([active_yinhao[num],active_yinhao[num+1]])
num+=2
active_fenhao.append(-1)
break
if first_yinhao==-1:
#print '剩余没有引号了'.decode("utf8")
break
if first_fenhao<first_yinhao:#假设第一个;在第一个"前面
#print first_fenhao,'之后所有"将失效'.decode('utf8')
#print active_yinhao
len_active_yinhao=len(active_yinhao)
#print range(len_active_yinhao),'-----------'
num=0
for cur_yinhao in active_yinhao:
if cur_yinhao>first_fenhao:
start_del_yinhao=active_yinhao.index(cur_yinhao)
for i in range(num,len_active_yinhao):#把当前分号之后所有引号全部设置为无效
del active_yinhao[start_del_yinhao]
#print active_yinhao
break
else:
None
num+=1
#print '=================='
#把有效引号序列变成有效引号对序列
len_active_yinhao=len(active_yinhao)
num=0
active_yinhao_pairs=[]
while num<len_active_yinhao:
active_yinhao_pairs.append([active_yinhao[num],active_yinhao[num+1]])
num+=2
break
if first_yinhao<first_fenhao:#假设第一个"在第一个;前面
#print '第一个"对之间的;将失效'.decode('utf8')
#print 'all_fenhao',all_fenhao
#print 'active_fenhao',active_fenhao
pair=public.first_fenhao_pair(line,start_pos,len_line)
#print '定位第一对": '.decode("utf8"),pair[0],pair[1]
for cur_fenhao in all_fenhao:
if cur_fenhao>pair[0] and cur_fenhao<pair[1]:
#print cur_fenhao,'分号失效'.decode("utf8")#当前没有用的分号
active_fenhao.remove(cur_fenhao)
#print '剩余有效分号'.decode("utf8"),active_fenhao
#print '剩余有效分号: '.decode('utf8'),active_fenhao
if pair[1]==-1:
#print "语法错误-1:一行内有效引号不成对".decode("utf8")
active_yinhao_pairs.append([-1,-1])
break
start_pos=pair[1]+1#新循环的开始位置
#print 'start_pos :',start_pos
if start_pos==-1:
#print '=================='
#把有效引号序列变成有效引号对序列
len_active_yinhao=len(active_yinhao)
num=0
while num<len_active_yinhao:
active_yinhao_pairs.append([active_yinhao[num],active_yinhao[num+1]])
num+=2
break
all_fenhao=active_fenhao
first_fenhao=public.first_fuhao(line,';',start_pos,len_line)
first_yinhao=public.first_fuhao(line,'"',start_pos,len_line)
print '所有有效的引号对'.decode("utf8"),active_yinhao_pairs
print '注释开始位置:'.decode("utf8"),active_fenhao[0]
return [active_yinhao_pairs,active_fenhao[0]]
print abc(cur_line)
#www.orayes.com
以下是./read.py的测试用例:
情况1:有效引号不成对(语法错误)
aa"bb"c";cdd;eeff
所有有效的引号对 [[-1, -1]]
注释开始位置: 8
[[[-1, -1]], 8]
情况2:没有有效引号
asdf;asdf"asdf";asdfasf
所有有效的引号对 []
注释开始位置: 4
[[], 4]
情况3:有成对有效引号,有注释
aa"bb"c";c"dd;"ee"ff
所有有效的引号对 [[2, 5], [7, 10]]
注释开始位置: 13
[[[2, 5], [7, 10]], 13]
情况4:有成对有效引号,无注释
aasdf"afd"awe"as;df"asf
所有有效的引号对 [[5, 9], [13, 19]]
注释开始位置: -1
[[[5, 9], [13, 19]], -1]
#www.orayes.com
|
|