正規表示式 Regular Expression

Slides:



Advertisements
Similar presentations
人的性别遗传 合肥市第四十九中学 丁 艳. 男女成对染色体排序图 1 、男性和女性各 23 对染色体有何异同 ? 哪 一对被称为性染色体 ? 2 、这两幅图中,哪幅 图显示的是男性的染色 体?哪幅图显示的是女 性染色体? 3 、图中哪条染色体是 Y 染色体?它与 X 染色体 在形态上的主要区别是.
Advertisements

第一單元 建立java 程式.
第七讲 管理类文体写作 管理类文书分为两类:公文、事务文书。 一,公文概述(教材P174-) (一)定义、范围、类别:
淺談學校差勤事宜 報告人 臺中市北屯區文心國小 王賜壽 102年6月13日.
壹 展会营销方式 在休闲娱乐产业中的分析. 壹 展会营销方式 在休闲娱乐产业中的分析 对于行业、企业、产品的作用 会展营销 的作用 会展营销 集行业资源要素、灵活多变的活动手段、面对面的展览展示等优点,已经发展成为所有行业开展营销工作的首选手段。 1、市场调研功能 5、注意力经济效应 2、产品创新功能.
「鬧鐘媽媽」vs.「教育媽媽」 談管教兒女的方法
任免遷調案例分析 屏東縣政府人事處 任免科 科長王怡雯.
医疗服务监督 问题理解与法律适用 石滨 全国省级卫生监督员执法能力培训班 卫生部全国医疗服务标准委员会 委员
1、一般地说,在生物的体细胞中, 和 都是成对存在的。
辨性别 A B. 辨性别 A B 第三节人类染色体与性别决定 昌邑市龙池初中 杨伟红 学习目标 1.理解人的染色体组成和传递规律。 2.解释人类性别决定的原理。 3.通过探究活动,解读数据了解生男生女的比例。
臺南市104學年度 國民中小學新進教師研習課程 廉政宣導與案例研習 臺南市政府教育局政風室 科員 黃彥雄.
張智星 台大資工系 多媒體檢索實驗室 第十章 通用表示法 張智星 台大資工系 多媒體檢索實驗室.
中五級中史科及通識科跨科研習 研習大澳的「宗教文化」─ 廟宇的研習 指導老師:周婉儀老師 組員: 陳偉欽 5a (15)
每周物流资讯 苏州得尔达国际物流有限公司 第四十三期.
龙海公寓· 多城一家O2O项目 商业计划书 2015年7月.
肺 痨.
作文教学如何适应高考的要求 漳州市普教室 李都明
您買美元了嗎? 退休規劃 全球外幣保單.
初中语文总复习 说明文 阅读专题 西安市第六十七中学 潘敏.
初中语文总复习 说明文 阅读专题.
中六級中國文化及語文科 閱讀報告 中六乙班 潘雅詩 (十三).
中国建筑钢结构施工企业诚信评价建设管理办法
优卡会介绍资料 ——健 康 数 据 管 理 专 家—— ——爱上优卡会,生活好品味
新世纪版(数学) 七年级(上)教材培训 青岛试验区.
臺中市健康促進學校之健康體位種子學校行動研究
1.1.2 四 种 命 题.
色 弱 與 色 盲.
通 知.
教師敘薪實務解說 大墩國小人事室 吳莉真
宠物之家 我的宠物性别? 雌(♀) or 雄(♂) 第一阶段:我的宠物我做主 第二阶段:宠物“相亲记” 第三阶段:家族诞生
File Access 井民全製作.
國語文好點子趴辣客教學食譜 甜點:〈焦糖鳥布蕾〉
员工合理化建议攻略 (2013版) 中心合理化建议项目组 王喜丰.
MATLAB 程式設計 通用運算式.
張智星 清大資工系 多媒體檢索實驗室 MATLAB 程式設計入門篇 通用運算式 張智星 清大資工系.
Java程式概觀.
生物資訊程式語言應用 Part 3 Perl Language.
SQL Stored Procedure SQL 預存程序.
(Circular Linked Lists)
FPGA計算浮點數的方法 姓名:蔡秉旂.
第二章 词法分析 (Lexical Analysis)
程式設計實習課(四) ----C 函數運用----
第一單元 建立java 程式.
始得西山宴遊記 柳宗元.
Redirection 概念說明 input redirection: 將資料“再”輸入到某一命令去做處理 (用<符號)
共有六個運算性質 包括它的證明以及相關題型
第五章 證券評價.
雲端計算.
JAVA 程式設計 資訊管理系 - 網路組.
輸入&輸出 函數 P20~P21.
第九章 字串.
第一次Labview就上手 參考書籍: LabVIEW for Everyone (Jeffrey Travis/Jim Kring)
撰寫MATLAB基礎財務程式 柯婷瑱.
挑戰C++程式語言 ──第8章 進一步談字元與字串
如何使用Gene Ontology 網址:
教師專業與權益相關法令 報告人 劉亞平.
挑戰C++程式語言 ──第7章 輸入與輸出.
第 4 章 認識 SQL 語言與資料型別.
11058: Encoding ★☆☆☆☆ 題組:Problem Set Archive with Online Judge
臺北市99學年度 輔導分發選習國民中學技藝教育學程 就讀高中職實用技能學程宣導說明會
1757: Secret Chamber at Mount Rushmore
臺北市私立大同高中105年 地震疏散演練 上午9時21分, 實施防災演練, 9月13日0730實施預演.
明湖國小 文書講習 時間: 地點:總務處.
智慧財產權管理講次36 積體電路電路布局保護法(1) 主講:吳銘圳
單選題 1. 2. 3. 4. Q1:下列何者能作為商標樣式?
Programming & Language Telling the computer what to do
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
臺北城市科技大學 核定改名後第一次訪視 重點概況
方法(Method) 函數.
InputStreamReader Console Scanner
Presentation transcript:

正規表示式 Regular Expression Python語言實戰-處理CGRD的report資料

處理CGRD的report資料 心臟超音波(M22-060) 讀出每一筆報告的LVEF (left ventricular ejection fraction) 它是一個1-99之間的數字

巨量資料 CGRD 5個資料夾 72個檔案 19.2G 上千萬筆 人工辨識

心內科報告 CGRD資料: ITEM = M22-060 2010~2017年:共621744筆 REPORT: 找出LVEF值 辨識度:70%→90%→95%→99%

LVEF = 32% LVEF(%) = 71 (M-mode)

EF by M-mode: XX % EF by 2-D method: XX%

LVEF M-mode(Teichholz) = XX %

LVEF M-mode(Teichholz) = XX-XX %, LVEF M-mode(Teichholz) = XX-XX %, Average = XX % 2D(M-Simpson) = XX-XX %, Average = XX %

LV SV/ EF (32-95ml/49-76%) OO / XX LV SV(ml)/ EF(%) (32-95/49-76) OO / XX

數值很長一串

沒有我們要判讀的LVEF值

EF by M-mode: XX % EF by 2-D method: XX% function SUBSTR CAT LOWCASE SCAN CATS UPCASE LEFT CATT PROPCASE RIGHT CATX FIND TRIM TRANWRD COMPRESS STRIP LENGTH COMPBL 前處理 大小寫轉換 空白處理 符號 找出pattern位置 FIND 計算字串長度 LENGTH 讀取2位數的LVEF SUBSTR

EF = XX%. LV SV/ EF (32-95ml/49-76%) OO / XX EF(%) = XX EF = XX% LV SV/ EF (32-95ml/49-76%) OO / XX EF(%) = XX LV SV(ml)/ EF(%)(32-95/49-76) OO / XX function SUBSTR CAT LOWCASE SCAN CATS UPCASE LEFT CATT PROPCASE RIGHT CATX FIND TRIM TRANWRD COMPRESS STRIP LENGTH COMPBL 前處理 大小寫轉換 空白處理 符號 找出pattern位置 FIND 計算字串長度 LENGTH 讀取2位數的LVEF SUBSTR

字串處理的大絕招 使用單個字串來描述pattern、找出符合一系列句法規則的字串str。 正規表示式最初是由Unix中的工具軟體(grep)普及開的。 許多程式語言都支援利用正規表示式進行字串操作。 Perl Python R SAS 9

描述pattern和子字串 在報告中找出特定的pattern、並且取得數值子字串 EF by M-mode: XX % EF by 2-D method: XX% EF = XX% EF(%) = XX LV SV/ EF (32-95ml/49-76%) OO / XX LV SV(ml)/ EF(%)(32-95/49-76) OO / XX

Python套件re import re re.sub re.search NewStr = re.sub (X pattern, Y str, OrgStr) #在OrgStr中,找出符合X pattern的字串、換成Y字串,結果存到NewStr re.search ans = re.search (X pattern, str, re.IGNORECASE) #re.IGNORECASE 忽略大小寫 #在str中找出符合X pattern的字串、結果存在ans ans[0] = 完整pattern ans.groups(n)子字串 # n為數字、第n個子字串 re.split #使用pattern分割字串,結果存到Nlist NList = re.split(r'[-,~_]', Str) #67-72-65,60-68-63 → ["67", "72", "65", "60", "68", "63"]

語法 特殊字元 貪婪 重複特定次數 字元集合 跳脫字元 子字串

特殊字元 特殊字元 說明 pattern . 符合除了\n之外的任何單個字元 ^ 符合輸入字串的開始位置 $ 符合輸入字串的結束位置 * 符合前面的子運算式零次或多次 EF:.* EF:開始到\n為止 + 符合前面的子運算式一次或多次 EF:.+ :後致少要有一個\n以外的字元 ? 符合前面的子運算式零次或一次 :? :可有可無 X|Y X正規表示式或Y正規表示式 a|baa a或baa (a|b)aa aaa或baa

貪婪 Greedy 儘可能多 vs non-greedy 儘可能少 str = xyz <a> b <c> pqr * pattern <.*> ans <a> b <c> *? pattern <.*?> ans <a> + +? ? ??

次數{} 次數 {m} 符合前面的子運算式m次 a{6} aaaaaa {m, n} 符合前面的子運算式m次到n次 a{3, 5} aaa 非貪婪 a{3, 5}? str = aaaaaa

字元集合 [] 匹配字元集合 [:=] 字元匹配:或= [a-z] -前後有字元:表示從某字元到某字元 所有小寫字母 [a\-z] [-a] [a-] 可使用跳脫符號來表示- 放在最前面 放在最後面 a或-或z -或a a或- [^] 放在最前面:表示排除 [^a-z] 排除小寫字母a-z [0-5][0-9] 第一個字元0-5;第二個字元0-9 [0-5][0-9]:[0-5][0-9] 分:秒 [0-9A-Fa-f] 16進位

\跳脫符號 跳脫符號 \ 使用限制字元 \* * \? ? \. . \\ \d [0-9] \d+ \d+\.\d+ 整數 浮點數 數字 \D [^0-9] \s [ \t\n\r\f\v] 任何空白字元 \S [^ \t\n\r\f\v] 非空白字元 \w [a-zA-Z0-9_] 字母數字底線 \W [^a-zA-Z0-9_] 非字母數字底線

子字串 ans = re.search (pattern, str) ans[0] 整串 ans.group(#)=(子字串) (…) Pattern = 開始評估:(\d+/\d+/\d+) Str = 結束分析 開始分析:2018/08/29 開始評估:2018/08/28 ans[0] = 開始評估:2018/08/28 ans.group(1) = 2018/08/28 (?:…) 不取得匹配子字串 不放進group \d+(\.\d+)? \d+(?:\.\d+)?

字串前處理 str = REPORT01 str = re.sub (" +", " ", str) #消除多的空白 str = re.sub ("\s+", " ", str) #\n str = re.sub(" ?, ?", ",", str) #去除,前後空白 str = re.sub ("\( ?", "(", str) #尋找pattern要\( \) str = re.sub (" ?\)", ")", str) #替換字串不需\

數字落落長 symbol = “[-,~]” #定義各種數字間的符號 num = "\d+(?:\.\d+)?" # number = num + "(?:" + symbol + num + ")*“ number = "_?\d+(?:\.\d+)?_?(?:[-,~]_?\d+(?:\.\d+)?_?)*" number = "(_?\d+(?:\.\d+)?_?(?:[-,~]_?\d+(?:\.\d+)?_?)*)" #子字串 numberx = "(?:_?\d+(?:\.\d+)?_?(?:[-,~]_?\d+(?:\.\d+)?_?)*)" #不取子字串

實戰例:pattern EF by M-mode: 76 % M mode 39% M-mode = 44% M mode: 27_% M[- ]mode ?[:=]? ?number ?% → Pattern = "M[- ]mode ?[:=]? ?" + number + " ?%" 2D(M-Simpson) = 10 % 2D(Msimpson) : 24 % 2D (Simpson)= 64.6% 2D ?\(M?-?Simpson\) ?[:=]? ?number ?% → Pattern = "2D ?\(M?-?Simpson\) ?[:=]? ?" + number + " ?%" LV-SV/EF (32-95ml/49-76%) 99_ / 97 LV SV/ EF (32-95ml/49-76%) 100 /40 LV[ -]SV ?/ ?EF ?\(32-95 ?ml ?/ ?49-76 ?%\) ?numberx ?/ ?number  Pattern = "LV[ -]SV ?/ ?EF ?\(32-95 ?ml ?/ ?49-76 ?%\) ?" + numberx + " ?/ ? " + number

程式架構 pattern input re LVEF output 維護pattern.xlsx 從Excel中取得pattern list 讀取CGRD原始檔 19.2G / 上百萬筆 ITEM = M22-060 保留心臟超音波(M22-060) 2010~2017年:共621744筆 re ans = re.search (pattern, report) #完整字串 = ans[0] 子字串 = ans.groups(1) LVEF 取得優先權最高的pattern為最終唯一的LVEF值 如有需要的話計算平均 output pattern字串 + 子字串 + 唯一的LVEF值 將所有無法判讀的report輸出到 no

Strength 機器已經打造完畢 只需要維護pattern

Strength

Limitation Key in資料錯誤 字串在奇妙的地方換行

其他應用 CGRD心內科報告 MR : LA(mm) : Trello Export Excel ptt網軍帶風向辨識 網路爬虫+正規表示式

reference Python re - Regular expression operations https://docs.python.org/3/library/re.html An Introduction to Perl Regular Expressions in SAS 9 http://www2.sas.com/proceedings/sugi29/265-29.pdf

demo Pattern LVEF MR : LA(mm) :

Q & A

FAQ 程式最難處理的部份 要如何找出pattern 各醫師複雜的數字記錄方式才是最麻煩的地方 可以請醫師或是PI提供pattern 自己找會花比較多時間、甚致跟本不知道要找什麼 克里斯多夫只需要希特勒萬歲就可以打敗恩尼格瑪