用Python實現古詩詞填字遊戲(一)
阿新 • • 發佈:2019-02-07
## Created by PosPro ## http://blog.csdn.net/pospro import re i=3200 # PosPro says:在測試時無需讀取全部資訊,可以通過此引數調整讀入行數,加快測試 INDEXNUM=0 EMPTYLINE=0 STATEFLAG=0 def processTitle(line): print (str(INDEXNUM), end='\t') #INDEX就是我自己做的詩文索引 idx1=line.find('【') idx2=line.find('】') poemTitle=line[idx1+1:idx2] author=line[idx2+1:] print(poemTitle,end='\t') if author.rstrip()=='': print ('佚名',end='\t') #發現有些詩句沒有註明作者,那我就自己標一下 else: print(author,end='\t') def processPoemText(line): #此時已深入到詩句中了,要將各種標點符號刪掉,並將每句詩文作為list中的一項 if not line=='': #PosPro says:如果要以多個不同字元作為分隔符,就必須用到re模組了 everyLine=re.split(',|。',line) for l in everyLine: print (l, end='\t') def processEndPoem(): print ('') #完成一個換行 def analyzeText(line): global INDEXNUM, EMPTYLINE, STATEFLAG if line=='': EMPTYLINE+=1 #PosPro says:構成一個無限迴圈,只有通過return才能夠退出整個函式,讀取下一行 while (True): if STATEFLAG==0: #0:始狀態,在此狀態下若發現某一行同時包含'卷'和'【',則進入詩句標題 if ('卷' in line) and ('【' in line): STATEFLAG=1 else: return #1: 表示當前句為標題 if STATEFLAG==1: INDEXNUM+=1 processTitle(line) STATEFLAG=2 EMPTYLINE=0 return #2: 表示正在讀取詩文,但需要特別考慮空行和進入下一首詩標題的情況 if STATEFLAG==2: if EMPTYLINE>2: processEndPoem() STATEFLAG=0 EMPTYLINE=0 return elif ('卷' in line) and ('【' in line): processEndPoem() STATEFLAG=1 EMPTYLINE=0 #PosPro says:此處不return,因為該line還需交由狀態1處理 else: processPoemText(line) return with open('全唐詩.txt',encoding='gbk',errors="ignore") as f: for line in f: #去除左右空白字元 line=line.rstrip().lstrip() if i>0: analyzeText(line) i-=1 else: break