如何正确使用正则表达式提取数据
我第一次接触正则表达式,现在需要从这个报告中提取一些数据(这是一个带格式信息的文本文件):
\n10: Vikelis M, Rapoport AM. 抗癫痫药物作为预防\n偏头痛的作用。CNS Drugs. 2010年1月1日;24(1):21-33。\ndoi:\n10.2165/11310970-000000000-00000。\n综述。PubMed PMID:\n20030417。\n\n\n21: Johannessen Landmark C, Larsson PG, Rytter E,\nJohannessen SI. 抗癫痫药物\n在癫痫和其他疾病中的应用——一项基于人群的处方研究。\nEpilepsy Res. 2009年11月;87(1):31-9。Epub 2009年8月13日。\nPubMed PMID: 19679449。\n\n\n
从上面可以看到,所有的文本记录都是以一个数字开头,比如“xx:”,并且总是以“PubMed PMID: dddddddd”结尾。但是我用这样的正则表达式:
regex = re.compile(r"^\d+: .+ PMID: \d{8}.$")
regex.findall(inputfile)
得到的结果是一个大字符串的列表,所以我可能理解错了。怎样才能从这些记录中提取数据呢?
2 个回答
如果你的记录和你例子中的一样整齐,那么你就不需要用到正则表达式。只要简单地把文本文件分成一个个小块就可以了。例如:
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
再说一次,如果你能相信每条记录的第一行是作者,第二行是标题,第三行是期刊等等,那你可以很快地处理这些信息。如果信息稍微复杂一点,那你可以开始用正则表达式了。
祝你好运。
使用 .+?
可以进行非贪婪匹配,而不是使用 .+
,后者会进行贪婪匹配。你还需要一个 re.DOTALL
,这样可以确保你的 .
能匹配到行尾的字符。同时,使用 re.MULTILINE
可以确保 ^
和 $
匹配的是每一行的开始和结束,而不仅仅是整个字符串的开始和结束。你需要把这些选项用“位或” |
操作符连接起来,然后作为第二个参数传递给 re.compile。