日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python黑屏改成白底_Python 进行黑屏 PNR 的提取

發(fā)布時(shí)間:2023/12/10 python 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python黑屏改成白底_Python 进行黑屏 PNR 的提取 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

重拾 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。