我正在尝试使用正则表达式来查找BibTex文件中的所有匹配模式。该文件如下所示:
bib_file = """
@article{Fu_2007_ssr,
doi = {10.1016/j.surfrep.2007.07.001}
}
@article{Shibuya_2007_apl,
doi = {10.1063/1.2816907}
}
"""
我的目标是找到所有匹配的模式,从@article
到}
,并将这些模式放入列表中。所以我的最终名单将是这样的:
['@article{Fu_2007_ssr,\n doi = {10.1016/j.surfrep.2007.07.001}\n }',
'@article{Shibuya_2007_apl,\n doi = {10.1063/1.2816907}\n }']
目前,我有我的代码:
rx_sequence = re.compile(r'(@article(.*)}\n)', re.DOTALL)
article = rx_sequence.search(bib_file).group(1)
但是article
是一个字符串,我怎样才能找到每个匹配的模式并将其附加到列表中?
答案 0 :(得分:1)
您可以将所有这些文章与
匹配r"(@article.*?\n[ \t]*}[ \t]*)(?:\n|$)"
(与re.DOTALL
的{{1}}修饰符一起使用以匹配任何包含新行的字符。请参阅regex demo
模式详情:
.
- 第1组捕获以下序列:
(@article.*?\n[ \t]*}[ \t]*)
- 文字@article
@article
- 任何零个或多个字符,尽可能少,直到第一个...... .*?
- 换行符,后跟0 +空格/制表符,\n[ \t]*}[ \t]*
以及0 +空格/制表符和... }
- 换行符((?:\n|$)
)或字符串结尾(\n
)。$
请注意,将模式展开为
import re
p = re.compile(r'(@article.*?\n[ \t]*}[ \t]*)(?:\n|$)', re.DOTALL)
s = "@article{Fu_2007_ssr,\ndoi = {10.1016/j.surfrep.2007.07.001}\n}\n\n@article{Shibuya_2007_apl,\n doi = {10.1063/1.2816907}\n}"
print(p.findall(s))
# => ['@article{Fu_2007_ssr,\ndoi = {10.1016/j.surfrep.2007.07.001}\n}',
# '@article{Shibuya_2007_apl,\n doi = {10.1063/1.2816907}\n}']
会使它更强大。请参阅another regex demo和Python demo(此正则表达式不需要@article.*(?:\n(?![ \t]*}[ \t]*(?:\n|$)).*)*\s*}
修饰符)。
答案 1 :(得分:1)
或者,您可以使用bibtexparser
为您省去所有麻烦:
>>> import bibtexparser
>>> bib_file = """
... @article{Fu_2007_ssr,
... doi = {10.1016/j.surfrep.2007.07.001}
... }
...
... @article{Shibuya_2007_apl,
... doi = {10.1063/1.2816907}
... }
... """
>>> b = bibtexparser.loads(bib_file)
>>> b.entries
[{'ENTRYTYPE': 'article', 'ID': 'Fu_2007_ssr', 'doi': '10.1016/j.surfrep.2007.07.001'}, {'ENTRYTYPE': 'article', 'ID': 'Shibuya_2007_apl', 'doi': '10.1063/1.2816907'}]
在那里,你有一个列表,其中包含正确拆分并映射到他们的围兜标题的bib文件中的项目。