Как изменить одинаковые ключи в bibtex-файле, которые соответствуют разным статьям

С помощью одного плагина я генерирую .bib файл. Может возникнуть ситуация, что для разных статей будет использоваться один и тот же ключ. Например:

@inproceedings{Hosseini_2016,
    doi = {10.1109/ism.2016.0028},
    url = {https://doi.org/10.1109%2Fism.2016.0028},
    year = 2016,
    month = {dec},
    publisher = {{IEEE}},
    author = {Mohammad Hosseini and Viswanathan Swaminathan},
    title = {Adaptive 360 {VR} Video Streaming: Divide and Conquer},
    booktitle = {2016 {IEEE} International Symposium on Multimedia ({ISM})}
}
@inproceedings{Hosseini_2016,
    doi = {10.1109/ism.2016.0093},
    url = {https://doi.org/10.1109%2Fism.2016.0093},
    year = 2016,
    month = {dec},
    publisher = {{IEEE}},
    author = {Mohammad Hosseini and Viswanathan Swaminathan},
    title = {Adaptive 360 {VR} Video Streaming Based on {MPEG}-{DASH} {SRD}},
    booktitle = {2016 {IEEE} International Symposium on Multimedia ({ISM})}

Библиотека pybtex, которую я использую для парсинга, считает, что под одинаковыми ключами записаны одинаковые статьи, и пропускает дубликаты. Но статьи на самом деле разные, и я хочу обработать их все. Как мне изменить ключи так, чтобы все они были разными?


Ответы (1 шт):

Автор решения: Кирилл Малышев

Решил проблему регулярными выражениями. Просто заменяю все ключи на nanoid. Наверняка есть более удачное решение, но мне подошло такое.

from nanoid import generate
import re

def process_bibtex(fn):
    with open(fn, encoding="utf-8") as r_file:
        bibtex = r_file.read()
    pattern = r"@([\w\W]+?){([\w\W0-9_\-]+?),"
    def callback(matchobj):
        return f"@{matchobj.group(1)}{{{generate()},"
    with open(fn, "w", encoding="utf-8") as w_file:
        w_file.write(re.sub(pattern, callback, bibtex))
→ Ссылка