使用pybtex库对bib格式的参考文献自动生成期刊格式
参考了这篇帖子:用Python代码自动生成文献的IEEE引用格式_如何修改bibtex参考文献的格式为ieee的样式-CSDN博客
不过直接用pybtex库就行,直接对bib文件进行提取就行了。目前是针对IEEE期刊格式,当然也可以根据其他期刊进行修改。
#!/usr/bin/python3 # -*- coding: utf-8 -*- import re from pybtex.database import parse_file def getIeeeJournalFormat(bibInfo): """ 生成期刊文献的IEEE引用格式:{作者}, "{文章标题}," {期刊名称}, vol. {卷数}, no. {编号}, pp. {页码}, {年份}. :return: {author}, "{title}," {journal}, vol. {volume}, no. {number}, pp. {pages}, {year}. """ # 避免字典出现null值 if "volume" not in bibInfo: bibInfo["volume"] = "null" if "number" not in bibInfo: bibInfo["number"] = "null" if "pages" not in bibInfo: bibInfo["pages"] = "null" journalFormat = bibInfo["author"] + \ ", \"" + bibInfo["title"] + \ ",\" " + bibInfo["journal"] + \ ", vol. " + bibInfo["volume"] + \ ", no. " + bibInfo["number"] + \ ", pp. " + bibInfo["pages"] + \ ", " + bibInfo["year"] + "." # 对格式进行调整,去掉没有的信息,调整页码格式 journalFormatNormal = journalFormat.replace(", vol. null", "") journalFormatNormal = journalFormatNormal.replace(", no. null", "") journalFormatNormal = journalFormatNormal.replace(", pp. null", "") journalFormatNormal = journalFormatNormal.replace("--", "-") return journalFormatNormal def getIeeeConferenceFormat(bibInfo): """ 生成会议文献的IEEE引用格式:{作者}, "{文章标题}, " in {会议名称}, {年份}, pp. {页码}. :return: {author}, "{title}, " in {booktitle}, {year}, pp. {pages}. """ conferenceFormat = bibInfo["author"] + \ ",\"" + bibInfo["title"] + ",\" " + \ "in " + bibInfo["booktitle"] + \ ", " + bibInfo["year"] + \ ", pp. " + bibInfo["pages"] + "." # 对格式进行调整,,调整页码格式 conferenceFormatNormal = conferenceFormat.replace("--", "-") return conferenceFormatNormal def getIeeeFormat(bibInfo): """ 本函数用于根据文献类型调用相应函数来输出ieee文献引用格式 :param bibInfo: 提取出的BibTeX引用信息 :return: ieee引用格式 """ if "journal" in bibInfo: # 期刊论文 return getIeeeJournalFormat(bibInfo) elif "booktitle" in bibInfo: # 会议论文 return getIeeeConferenceFormat(bibInfo) # 查找名,并按格式进行缩写 def capitalLetter(name): resName = '' for i in name: if i.isupper(): resName += i + '. ' return resName # 按照bib格式,调整作者的姓名缩写形式 def nameModefy(name): nameList = name.split(' and ') resNames = [] for index in range(len(nameList)): if index > 1: break names = nameList[index].split(',') if len(names) < 2: continue for i in range(len(names)): names[i] = names[i].strip() resName = capitalLetter(names[1]) + names[0] resNames.append(resName) result = ' and '.join(resNames) if len(nameList) > 2: result += ', et al.' return result def inforDir(bibtex): # pattern = "[\w]+={[^{}]+}" 用正则表达式匹配符合 ...={...} 的字符串 pattern1 = "[\w]+=" # 用正则表达式匹配符合 ...= 的字符串 pattern2 = "{[^{}]+}" # 用正则表达式匹配符合 内层{...} 的字符串 # 找到所有的...=,并去除=号 result1 = re.findall(pattern1, bibtex) for index in range(len(result1)): result1[index] = re.sub('=', '', result1[index]) # 找到所有的{...},并去除{和}号 result2 = re.findall(pattern2, bibtex) for index in range(len(result2)): result2[index] = re.sub('\{', '', result2[index]) result2[index] = re.sub('\}', '', result2[index]) # 创建BibTeX引用字典,归档所有有效信息 infordir = {} for index in range(len(result1)): if result1[index] == 'author': infordir[result1[index]] = nameModefy(result2[index]) else: infordir[result1[index]] = result2[index] return infordir def inputBibTex(): """ 在这里输入BibTeX格式的文献引用信息 :return:提取出的BibTeX引用信息 """ bibtex = [] print("请输入BibTeX格式的文献引用:") i = 0 while i < 15: # 观察可知BibTeX格式的文献引用不会多于15行 lines = input() if len(lines) == 0: # 如果输入空行,则说明引用内容已经输入完毕 break else: bibtex.append(lines) i += 1 return inforDir("".join(bibtex)) if __name__ == '__main__': refs=[] # 读取 BibTeX 文件 bib_data = parse_file('myrefs.bib') # 初始化一个空列表 formatted_articles = [] refers_type=['article','book'] # 遍历条目并提取 @article 类型的条目 for entry_key, entry in bib_data.entries.items(): if entry.type in refers_type: # 提取作者 authors = [f"{author.first_names[0][0]}. {author.last_names[0]}" for author in entry.persons['author']] authors_str = ', '.join(authors[:-1]) + ', and ' + authors[-1] if len(authors) > 1 else authors[0] # 提取其他字段并进行检查 title = entry.fields.get('title', 'N/A') journal = entry.fields.get('journal', 'N/A') volume = entry.fields.get('volume', 'N/A') number = entry.fields.get('number', 'N/A') pages = entry.fields.get('pages', 'N/A') year = entry.fields.get('year', 'N/A') # 格式化字符串 formatted_entry = f"{authors_str}, “{title},” {journal}, vol. {volume}, no. {number}, pp. {pages}, {year}." formatted_articles.append(formatted_entry) # 打印结果 for ref in formatted_articles: print(ref) with open('formatted_articles.txt', 'w', encoding='utf-8') as f: f.writelines(f"{line}\n" for line in formatted_articles) # f.writelines(formatted_articles) # bibInfo = inputBibTex() # 获得BibTeX格式的文献引用 # print(getIeeeFormat(bibInfo)) # 输出ieee格式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2020-10-14 vs 2019 offline帮助文档的下载问题