我在文本檔案中有以下資料。
T79534 TARGETID T79534
T79534 FORMERID TTDI01219
T79534 TARGNAME P450-dependent ergosterol synthesis (PDE synth)
T79534 TARGTYPE Discontinued target
T79534 DRUGINFO D0T5NI Saperconazole Discontinued in Phase 2
T78590 TARGETID T78590
T78590 FORMERID TTDI01580
T78590 TARGNAME Polymorphonuclear neutrophil adhesion (PMNA)
T78590 TARGTYPE Discontinued target
T78590 DRUGINFO D0OB7J NPC-15669 Discontinued in Phase 1
我想提取TARGETID和TARGTYPE欄位的值。我正在使用以下 python 代碼行來獲取此資料(target_file 是包含此資料的變數:)<class 'pandas.core.frame.DataFrame'>。
for index, row in target_file.iterrows():
if re.match("r^[A-Z] .*", str(row['field'])):
if row['field'] == 'TARGETID':
target_id = row['value']
elif row['field'] == 'TARGTYPE':
target_type = row['value']
else:
continue
elif re.match("r^\s |$\Z", str(row['field'])): #if matches space or end of file, get the data
print (target_id, target_type, uniprot_id)
#empty the variable for new loop
target_id = ''
target_type = ''
else:
'do nothing'
我假設 elif 條件 ( re.match("r^\s |$\Z", str(row['field']))) 中的正則運算式不起作用。
預期的輸出是:
T79534 Discontinued target
T78590 Discontinued target
非常感謝這里的任何幫助
uj5u.com熱心網友回復:
如果沒有更多我不知道的條件并且每個塊總是有一個TARGETID和一個TARGTYPE,那么你可以在下面這樣做df:
out = df.loc[df['field'].isin(['TARGETID','TARGTYPE']),'value']
print(out)
Output:
0 T79534
3 Discontinued target
5 T78590
8 Discontinued target
如有必要,要完全匹配您想要的輸出,您可以使用以下方法執行以下操作out:
for i,k in zip(out[0::2], out[1::2]):
print(i,k)
Output:
T79534 Discontinued target
T78590 Discontinued target
這有幫助嗎?
更新: 如果您想直接從文本檔案中執行此操作而不創建 DataFrame,您可以這樣做:
with open('000_SO_input3.txt', 'r') as f:
for line in f:
if len(line.strip())!=0:
ID, fields, value = [x.strip() for x in line.split(maxsplit=2)]
if fields=='TARGETID':
targetid = value
elif fields=='TARGTYPE':
targtype = value
else:
print(targetid, targtype)
print(targetid, targtype)
如果它不是空行,則拆分該行并檢查搜索詞的命中,否則(您有一個空行)列印targetidand的當前值targtype。請注意,在最后您再次列印相同的陳述句,因為最后沒有空行,并且您的結果不會列印兩個變數的最后一個當前值。
編輯您的代碼:我剛剛查看了您嘗試過的代碼。首先,兩個正則運算式都有一個錯字。對于 r-stringr需要在 之外"...",所以它必須在r"^[A-Z] .*". 你實際上只是搜索一個詞,所以這個詞也會這樣做r"\w "。其次你需要知道你在做什么,你不檢查一個大的多行字串,你檢查 column 的每個單元格,field不需要row('field')用str(). 與第二個正則運算式模式相同。您逐個單元格檢查,因此您不會在file結束時捕捉到,因為 for 回圈僅在最后一個單元格之后停止。并且空行被自動洗掉(至少當我將資料從文本檔案加載到 df 時是這樣),所以你也不會點擊它。一般來說r"^\s "將匹配一個空字串或只有空格的字串,但沒有一個,所以你elif永遠不會被執行。如果您只是在所有 if elif 和 else 中插入一些列印陳述句以查看代碼如何執行,您將看到。
uj5u.com熱心網友回復:
re.findall 似乎更簡單。
(我省略了檔案讀取部分,因為您似乎對此沒有任何問題,并且在一個檔案中撰寫示例代碼更容易。)
import re
myfile=(
'T79534 TARGETID T79534 ',
'T79534 FORMERID TTDI01219 ',
'T79534 TARGNAME P450-dependent ergosterol synthesis (PDE synth) ',
'T79534 TARGTYPE Discontinued target ',
'T79534 DRUGINFO D0T5NI Saperconazole Discontinued in Phase 2',
'T78590 TARGETID T78590 ',
'T78590 FORMERID TTDI01580 ',
'T78590 TARGNAME Polymorphonuclear neutrophil adhesion (PMNA) ',
'T78590 TARGTYPE Discontinued target ',
'T78590 DRUGINFO D0OB7J NPC-15669 Discontinued in Phase 1',)
target_id = ''
target_type = ''
for f in myfile:
g = re.findall('\w \s (\w )\s (\w )',f)
if g[0][0] == 'TARGETID':
target_id = g[0][1]
if g[0][0] == 'TARGTYPE':
target_type = g[0][1]
if target_id:
print(target_id)
if target_type:
print(target_type)
target_id = ''
target_type=''
輸出
T79534
Discontinued
T78590
Discontinued
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/460136.html
