Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python从基于引用键的bibtex文件中删除特定条目_Python_Regex_Bibtex - Fatal编程技术网

使用Python从基于引用键的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

如何使用python从基于引用键的bibtex文件中删除特定条目?我基本上想要一个函数,它接受两个参数(bibtex文件的路径和cite键),并从文件中删除与键对应的条目。我玩过正则表达式,但没有成功。我也找了一点bibtex解析器,但这似乎有点过分了。在下面的框架函数中,决定性的部分是
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)