![](/img/trans.png)
[英]How to make regex to Put semi-unstructured data in table or dataframe Python?
[英]How to make a regex for table data in Python
我有一個文件,它是一個.Txt 文件,我想制作一個可以從中解析某種數據的正則表達式。
我試過這樣做,但我無法得到我想要的東西
這是一種 TABLE 數據,格式可能與其他文件相同
我在這里添加這些數據,請將其視為.txt 文件
幫助將不勝感激。
Tribhuwan Diagnostic Centre | HOSPITALROAD, Morne)
East Champaran- 845401 (Bihar)
(FULLY AUTOMATED & COMPUTERISED LAB) Mob. :+9162046 29003
Name HAJAN sadshaj Booking Date 22/s/2020
G/A male 18 Yrs Reporting Date 22/05/2020
Lab No. 10203693 Sample Collected At Lab
Ref. By Dr. I.C.U
; UVLO
Test Name Value Unit Biological Ref Interval
COMPLETE BLOOD COUNT (CBC)
TOTAL LEUCOCYTES COUNT (TLC) 23160 cells/cmm 4000 - 11000
DIFFERENTIAL LEUCOCYTES COUNT (DLC)
NEUTROPHILS 93.4 % 45.0 - 65.0
LYMPHOCYTES 3.3 % 20.0 - 45.0
MONOCYTES 3.1 % 4.0 - 10.0
EOSINOPHILS 0.2 % 0.0 - 5.0
BASOPHILS 0.0 % 0.0-1.0
ABSOLUTE NEUTROPHILS 21620.0 3000.0 - 7000.0
ABSOLUTE LYMPHOCYTES 750.0 800.0 - 4000.0
ABSOLUTE MONOCYTES 730.0 0.0 - 1200.0
ABSOLUTE EOSINOPHILS 50.0 0.0 - 500.0
ABSOLUTE BASOPHILS 10.0 0.0 - 100.0
RBC COUNT 4.31 Millions/cmm 3.80 - 5.80
HAEMOGLOBIN (Hb) 13.1 gm/dl 11.0 - 16.5
P.C.V/HCT 41.2 % 35.0 - 50.0
MCV 95.5 fl. 80.0 - 97.0
MCH 30.3 Picogram 26.5 - 35.5
MCHC 31.8 g/dl 31.5-35.5
RDW / SD 49.7 FI 37.0 - 54.0
RDW / CV 12.3 % 10.0 - 15.0
PLATELET COUNT 148000 /cmm 150000 - 450000
PDW 17.0 fl 10.0 - 18.0
MPV 13.3 fl 6.5 - 11.7
PCT 0.198 % 0.108 - 0.282
Le
_
我只想從中獲得前兩列
output 我想要(測試名稱,值):
TOTAL LEUCOCYTES COUNT (TLC) 23160
DIFFERENTIAL LEUCOCYTES COUNT (DLC)
NEUTROPHILS 93.4
LYMPHOCYTES 3.3
MONOCYTES 3.1
EOSINOPHILS 0.2
BASOPHILS 0.0
ABSOLUTE NEUTROPHILS 21620.0
ABSOLUTE LYMPHOCYTES 750.0
ABSOLUTE MONOCYTES 730.0
ABSOLUTE EOSINOPHILS 50.0
ABSOLUTE BASOPHILS 10.0
RBC COUNT 4.31
HAEMOGLOBIN (Hb) 13.1
P.C.V/HCT 41.2
MCV 95.5
MCH 30.3
MCHC 31.8
RDW / SD 49.7
RDW / CV 12.3
PLATELET COUNT 148000
PDW 17.0
MPV 13.3
PCT 0.198
這種數據很難用正則表達式解析,但你可以試試這個(可能需要針對其他文本文件進行調整)( regex101 ):
import re
# variable `txt` is your text file from question
for col1, col2 in re.findall(r'^\s{13}([A-Z.]{2}[^\n\d]*[A-Z)])(?:\s*([\d.]+)|[^$])', txt, flags=re.MULTILINE):
print('{:<50}{}'.format(col1, col2))
印刷:
TOTAL LEUCOCYTES COUNT (TLC) 23160
DIFFERENTIAL LEUCOCYTES COUNT (DLC)
NEUTROPHILS 93.4
LYMPHOCYTES 3.3
MONOCYTES 3.1
EOSINOPHILS 0.2
BASOPHILS 0.0
ABSOLUTE NEUTROPHILS 21620.0
ABSOLUTE LYMPHOCYTES 750.0
ABSOLUTE MONOCYTES 730.0
ABSOLUTE EOSINOPHILS 50.0
ABSOLUTE BASOPHILS 10.0
RBC COUNT 4.31
HAEMOGLOBIN (Hb) 13.1
P.C.V/HCT 41.2
MCV 95.5
MCH 30.3
MCHC 31.8
RDW / SD 49.7
RDW / CV 12.3
PLATELET COUNT 148000
PDW 17.0
MPV 13.3
PCT 0.198
您可以使用python 正則表達式庫來實現您想要的。 我開始為您的問題編寫一個正則表達式,但沒有完成。 當我到達令人滿意的地方時,我會更新我的帖子。
目前,正則表達式匹配以空白字符開頭的每一行的第一列和第二列,具有第一個字母數字列和第二個數字列。 我們需要在只有一列的行上添加匹配項。
^\s+([[a-zA-Z()\/. ]+)\s+(\d+.\d+)
您可以在regex101.com上輕松編寫和測試您的正則表達式,它使您可以輕松地可視化他們正在做什么來調試它們。
[編輯]
這個應該可以解決問題,但是您需要在通過正則表達式之前清理一下輸入字符串。 假設標題COMPLETE BLOOD COUNT (CBC)
會一直存在,你可以撥打 python find
function 並刪除前面的字符。
(^\s+([[a-zA-Z()\/. ]+)\s+((\d+.\d+)))|(^\s+(([[a-zA-Z()\/. ]+))\s+\R)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.