如何正确使用正则表达式提取数据

0 投票
2 回答
956 浏览
提问于 2025-04-16 01:44

我第一次接触正则表达式,现在需要从这个报告中提取一些数据(这是一个带格式信息的文本文件):

\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 个回答

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

再说一次,如果你能相信每条记录的第一行是作者,第二行是标题,第三行是期刊等等,那你可以很快地处理这些信息。如果信息稍微复杂一点,那你可以开始用正则表达式了。

祝你好运。

2

使用 .+? 可以进行非贪婪匹配,而不是使用 .+,后者会进行贪婪匹配。你还需要一个 re.DOTALL,这样可以确保你的 . 能匹配到行尾的字符。同时,使用 re.MULTILINE 可以确保 ^$ 匹配的是每一行的开始和结束,而不仅仅是整个字符串的开始和结束。你需要把这些选项用“位或” | 操作符连接起来,然后作为第二个参数传递给 re.compile

撰写回答