使用Python从基于引用键的bibtex文件中删除特定条目
如何使用python从基于引用键的bibtex文件中删除特定条目?我基本上想要一个函数,它接受两个参数(bibtex文件的路径和cite键),并从文件中删除与键对应的条目。我玩过正则表达式,但没有成功。我也找了一点bibtex解析器,但这似乎有点过分了。在下面的框架函数中,决定性的部分是使用Python从基于引用键的bibtex文件中删除特定条目,python,regex,bibtex,Python,Regex,Bibtex,如何使用python从基于引用键的bibtex文件中删除特定条目?我基本上想要一个函数,它接受两个参数(bibtex文件的路径和cite键),并从文件中删除与键对应的条目。我玩过正则表达式,但没有成功。我也找了一点bibtex解析器,但这似乎有点过分了。在下面的框架函数中,决定性的部分是content\u modified= def deleteEntry(path, key): # get content of bibtex file f = open(path, 'r') con
content\u modified=
def deleteEntry(path, key):
# get content of bibtex file
f = open(path, 'r')
content = f.read()
f.close()
# delete entry from content string
content_modified =
# rewrite file
f = open(path, 'w')
f.write(content_modified)
f.close()
下面是一个bibtex文件示例(摘要中带有空格):
编辑:这是我提出的一个解决方案。它不是基于匹配整个bibtex条目,而是查找所有开头的@article{dai2008thebigfishlittlepond,
,然后通过切片上下文字符串删除相应的条目
content_keys = [(m.group(1), m.start(0)) for m in re.finditer("@\w{1,20}\{([\w\d-]+),", content)]
idx = [k[0] for k in content_keys].index(key)
content_modified = content[0:content_keys[idx][1]] + content[content_keys[idx + 1][1]:]
正如Beni Cherniavsky Paskin在评论中提到的那样,您必须依赖这样一个事实,即您的BibTex条目将在行开始之后开始和结束(没有任何制表符或空格)。然后您可以执行以下操作:
pattern = re.compile(r"^@\w+\{"+key+r",.*?^\}", re.S | re.M)
content_modified = re.sub(pattern, "", content)
注意这两个修饰符。S
使
匹配换行。M
使^
在字符串开头匹配
如果您不能依赖这一事实,那么BibTex格式就不是一种常规语言(因为它允许嵌套
{}
,必须对其进行计数以获得正确的结果。有一些正则表达式的风格,这可能仍然使此任务成为可能(使用递归或平衡组),但我认为Python不支持这些特性。因此,您实际上必须使用BibTex解析器(我想这也会使您的代码更容易理解)。您能依靠关闭}
在这一行的开头,我们的问题是,你是否需要数大括号才能知道条目的结尾?谢谢!我将尝试一下。我还添加了我自己的问题解决方法。
pattern = re.compile(r"^@\w+\{"+key+r",.*?^\}", re.S | re.M)
content_modified = re.sub(pattern, "", content)