2010-07-23 98 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