1. 程式人生 > >用Python實現古詩詞填字遊戲(一)

用Python實現古詩詞填字遊戲(一)

## 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