Python正则表达式 - 在文件中查找模式并将它们放在列表中

时间:2016-08-15 16:57:48

标签: python regex

我正在尝试使用正则表达式来查找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是一个字符串,我怎样才能找到每个匹配的模式并将其附加到列表中?

2 个答案:

答案 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)。

Python demo

$

请注意,将模式展开为

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 demoPython 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文件中的项目。