使用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格式
复制代码

 

posted on   风中狂笑  阅读(71)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2020-10-14 vs 2019 offline帮助文档的下载问题

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示