python黑屏改成白底_Python 进行黑屏 PNR 的提取
重拾 Python 的學(xué)習(xí),二刷了 Learn python the hard way 和廖雪峰老師的教程后,還是有點(diǎn)懵逼。考慮到日常工作常會(huì)給出一些邏輯判斷相關(guān)的需求。就想嘗試寫一二個(gè),畢竟學(xué)以致用。
最近給DT哥哥提了一個(gè)從中航信系統(tǒng)的返回內(nèi)容提取 PNR 的邏輯,先說下 PNR —— Passenger Name Record 旅客訂座記錄,是系統(tǒng)用于查看所有關(guān)于乘客出行信息的唯一性編碼,它大概有這些特征:
基本(核心)特征:PNR 一定是個(gè) 6 位的、由數(shù)字或字母拼的字符組
每一次封口(相當(dāng)于保存操作)指令必定伴隨著一個(gè) PNR 的創(chuàng)建、修改或刪除
PNR經(jīng)常會(huì)展示在所在行的最前面,即:PNR是本行第一個(gè)字符組的概率很高
PNR有時(shí)會(huì)展示在返回內(nèi)容的首行,但不是絕對(duì)的,所以只能輔助判斷
PNR有時(shí)會(huì)單獨(dú)占一行,即:若一行僅有一個(gè)字符組且字符組滿足PNR的基本特征,那么它是PNR的概率很高
返回內(nèi)容里很可能存在長度為6位但不是PNR的內(nèi)容,即出發(fā)到達(dá)機(jī)場(chǎng)三字碼的組合(比如PVGKIX代表上海到大阪),但幸運(yùn)的是這種情況我們是比較容易排除的,比如三字碼組的后方肯定是行動(dòng)代碼,而行動(dòng)代碼的格式是固定的
有一定的概率,返回內(nèi)容會(huì)展示一行RT: PNR 的數(shù)據(jù),即:當(dāng)一行首個(gè)字符組是RT,第二個(gè)字符組符合PNR基本特征,那么它是編碼的概率極高
編碼是少有的可能在返回內(nèi)容的不同行重復(fù)出現(xiàn)的,即:若返回內(nèi)容里有多個(gè)符合PNR特征的相同字符組,那么該字符組是PNR的可能性進(jìn)一步加高
如上文所述,封口對(duì)應(yīng)的 PNR 操作可能有創(chuàng)建、修改、刪除。我暫且先選擇了創(chuàng)建時(shí)的場(chǎng)景進(jìn)行識(shí)別,其程序邏輯描述大概有:
以空格為間隔符,查找返回內(nèi)容每行的獨(dú)立字符組,選取其中長度為6位由數(shù)字或字母的字符組,作為PNR待選項(xiàng),設(shè)置每個(gè)符合該基本特征的字符組得分 1
若待選字符組是本行第1個(gè)字符組,則得分 +2 ,若該字符組行內(nèi)下一個(gè)字符組為 '-'或'-EOT'或空則再 +1
若待選字符組是本行第2個(gè)字符組且第一個(gè)字符組為'RT'或'RT:',則得分 +3
若待選字符組下一個(gè)字符組是行動(dòng)代碼(格式為HK/DK/HL/HN+數(shù)字),則得分 -3
將相同待選字符組的得分相加,選擇得分最高的作為 PNR 可能選項(xiàng)(后面還有一些其他選項(xiàng)不過都不是重點(diǎn)了)
說干就干,核心思路是利用正則進(jìn)行提取和判斷,我將多個(gè)樣例內(nèi)容存放在一個(gè)txt方便判斷邏輯面對(duì)不同內(nèi)容的識(shí)別準(zhǔn)確度,為了查看文件,還需要用到 IO(用了比較省心的with open..)
import re #導(dǎo)入正則表達(dá)式模塊
pnrlines = [] #定義文本行信息
with open('pnr.txt','r') as pnrtext: #打開待識(shí)別的txt文本
pnrlines = pnrtext.readlines() #提取每一行,去掉首位空格后賦值給行信息
通過readlines按行讀取(“行”的概念后面要用到所以這里這樣考慮了),并定義了后面會(huì)用到的各種特征的識(shí)別函數(shù)(符合基本特征的編碼、RT、行動(dòng)代碼):
def getPnr(lineText): #定義根據(jù)空格或換行切分字符組的函數(shù)
get_pnr = re.split(r'[\s\n]+',lineText.strip())
return get_pnr
def findPnrs(lineText2): #定義判斷條件:str是否為6位字母+數(shù)字,若是返回該值
if re.match(r'^([0-9a-zA-Z]{6})$',lineText2):
find_pnrs = re.match(r'^([0-9a-zA-Z]{6})$',lineText2).group()
elif re.match(r'^(HK|DK|HN)[0-9]{1}$',lineText2):
find_pnrs = 'PreNone'
elif re.match(r'^(RT|RT:)$',lineText2):
find_pnrs = 'NexPNR'
else:
find_pnrs = 'none'
return find_pnrs
輪詢每行的每個(gè)字符,進(jìn)行對(duì)字符的特征進(jìn)行識(shí)別,標(biāo)記其屬性(待選項(xiàng)、RT、行動(dòng)代碼)并將打分預(yù)置
i = 0
for i in range(len(pnrlines)): #循環(huán)每一行
this_line = pnrlines[i]
pnrlist = getPnr(this_line)
print('第%d行:\n'%(i+1))
print('this_line: ',this_line)
print('pnrlist: ',pnrlist,'\n')
p = 0
q = p + 1
likePNR = []
PNRCODE = {}
defaultPsb = 0
for p in range(len(pnrlist)): #循環(huán)行內(nèi)每個(gè)切分出的字符組
thisPnr = pnrlist[p]
pnrs = findPnrs(thisPnr) #判斷字符組是否滿足條件(6位字母+數(shù)字)
#print('NO.',p+1,': ',thisPnr,' | 結(jié)果: ',pnrs) #打印每個(gè)字符組的判斷結(jié)果
likePNR.append(pnrs)
PNRCODE[pnrs] = 0
p += 1
#print('pnrcheck: ',likePNR)
if pnrs not in ('none','NexPNR','PreNone'):
psb = defaultPsb + 1
elif pnrs == 'NexPNR':
False
else:
psb = defaultPsb
PNRCODE[pnrs] = psb
PNRCODE['none'] = 0 #強(qiáng)行為dict增加一個(gè)none
del PNRCODE['none'] #刪除dict里的none
print('PNRCODE: ',PNRCODE)
print('\n')
i += 1
運(yùn)行后,得到了一個(gè)結(jié)果,當(dāng)然這只是個(gè)中繼,還沒有判斷加分項(xiàng):
未完待續(xù)..
總結(jié)
以上是生活随笔為你收集整理的python黑屏改成白底_Python 进行黑屏 PNR 的提取的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Git客户端操作GitHub
- 下一篇: python人脸照片分类_Python