2010-07-23 19 views
0

我現在面臨的常客表達式首次提取數據,我需要從這份報告中提取一些數據(帶格式信息的TXT文件):如何正確使用正則表達式

\ N10:Vikelis M,Rapoport AM。的 抗癲癇藥物預防性 代理商\ nmigraine作用。中樞神經系統藥物。 2010 Jan 1; 24(1):21-33。 doi:\ n10.2165/11310970-000000000-00000。 評論。考研結論: 20030417. \ n \ n \ N21:約翰內森地標C,拉爾森PG,Rytter的E, 約翰內森SI。抗癲癇\ ndrugs在癲癇等疾病 - 的 處方一 基於人羣的研究\ nEpilepsy水庫。 2009年 Nov; 87(1):31-9。電子版2009年08月13 考研結論:19679449. \ n \ n \ n

正如你可以看到所有的TXT的記錄始於一個數字,如 「XX」,並始終以「考研PMID結束:DDDDDDDD。但使用這樣的正則表達式:

regex = re.compile(r"^\d+: .+ PMID: \d{8}.$") 
regex.findall(inputfile) 

給了我一個大的字符串列表,所以我誤解的東西我怎樣才能從這些記錄中提取數據

回答

2

使用.+?非貪婪匹配?而不是.+,它會給你貪婪的匹配,你也想要一個re.DOTALL以確保您的.匹配它需要匹配的行尾字符,並確保^$匹配行的開始和結束,而不僅僅是整個字符串。有問題的選項需要與「位或」 |運營商加入,並通過作爲第二個參數來re.compile

+0

已應用和測試:'re.findall(r'(\ d +):(。+?)PubMed PMID:(\ d {8})',data,re.M | re.S)' – tux21b 2010-07-23 16:35:15

+0

什麼是貪婪的匹配?這意味着正則表達式引擎可以匹配儘可能多的字符。這是默認行爲。 OP發生的事情是,他的正則表達式匹配「\ d +:」的第一次出現,然後匹配最後發生的「\ d {8}。」,從而有效地匹配整個輸入文本。 – 2010-07-23 16:50:15

+0

感謝您的幫助,「非貪婪匹配」改變了很多事情:) RegEx確實是一個強大的工具! – 2010-07-23 16:50:32

1

如果在您的例子給出的記錄爲一致的,你不需要使用正則表達式。把文本文件簡單分割成令牌列表就可以了。例如:

txt = '\n10: Vikelis M, Rapoport AM. Role of antiepileptic drugs as preventive agents for \nmigraine. CNS Drugs. 2010 Jan 1;24(1):21-33. doi:\n10.2165/11310970-000000000-00000. Review. PubMed PMID: 20030417.\n\n\n21: Johannessen Landmark C, Larsson PG, Rytter E, Johannessen SI. Antiepileptic\ndrugs in epilepsy and other disorders--a population-based study of prescriptions.\nEpilepsy Res. 2009 Nov;87(1):31-9. Epub 2009 Aug 13. PubMed PMID: 19679449.\n\n\n' 

lines = [token.replace('\n', '') for token in txt.split('.')] 
for line in lines: 
    print line 

將線打印線的參考文獻中的每個元素:

10: Vikelis M, Rapoport AM 
Role of antiepileptic drugs as preventive agents for migraine 
CNS Drugs 
2010 Jan 1;24(1):21-33 
doi:10 
2165/11310970-000000000-00000 
Review 
PubMed PMID: 20030417 
21: Johannessen Landmark C, Larsson PG, Rytter E, Johannessen SI 
Antiepilepticdrugs in epilepsy and other disorders--a population-based study of prescriptions 
Epilepsy Res 
2009 Nov;87(1):31-9 
Epub 2009 Aug 13 
PubMed PMID: 19679449 

同樣,如果你能相信一個記錄的第一行的作者;第二個是標題,第三個是期刊等,你可以很快做到這一點。如果信息有點「上下文」,那麼你可以在這時開始使用正則表達式。

好運。

+0

記錄是平時基本一致,甚至我不能肯定這在更大的規模。雖然你的解決方案比RegEx(快得多)快,所以我會嘗試這兩種方法,並直接查看優點/缺點:)感謝您的幫助! – 2010-07-23 17:13:30