# 参考文献排序

发布时间: 2023-01-26

--- 苦参考文献排序久已, 如今终于有时间写个脚本自动排序了 (或许改用endnote才是更好的选择). 环境: Python 3.7.8rc1 # 一. 整体框架构思 用户将参考文件放入txt文件中, 读取参考文献后提取作者姓名等信息并排序, 最后将排序结果输出到txt中. 对于我个人来说, 对于排序其实需求不大, 因为大概率只有个别参考文献的顺序不对, 故添加了提示功能, 可以给出修改建议. 总所周知, python 无法直接跨环境运行, 如果想在别人电脑上运行, 最好是打包一下. # 二. 具体实现 首先是信息的分离, 这并不简单, 我用到了正则表达式这一字符串处理利器. 观察对我来说常用的参考文献格式, 有三种模式 1. [1] A. Zhang, 文章名, ... 2. [2] A. Zhang and Bo. Li, 文章名, ... 3. [zlw] A. Zhang, Bo. Li and C. Wang, 文章名, ... 我们可以很容易的分离索引和参考文献内容. # 按 id 分割字符串, 只匹配括号内长度小于等于 8 的 list_id = re.findall(r'\[[0-9a-zA-Z]{1,8}]', s) list_text = re.split(r'\[[0-9a-zA-Z]{1,8}]', s) 接下来是从参考文献中提取作者. 对于情况2和3很简单, 识别 [and Bo. 姓氏,] 这种模式的字符串就行. 此处不能直接识别 [and ... ,] 这种模式, 因为文章里面也会出现 and, 会导致识别错误. 如果情况2和3没能匹配上, 那就是情况1了. 那么只需匹配 [...,] 这种模式就行. 如果参考文献格式错误, 也会导致识别失败. # 先匹配多个作者的情况 (有and) my_match = re.match(r'.+ and [A-Za-z]{1,2}\. .+?,', my_str) # 再匹配1个作者的情况 (无and) if my_match is None: my_match = re.match(r'.+?,', my_str) 代码中的?去掉的话就是贪婪匹配, 会匹配最长字符串, 这不是我们想要的. 作者姓氏的提取我非常暴力, 利用re.sub把 'Bo.', ',', 和 'and' 这三种字符删掉, 剩下的就是由姓氏和空格组成的string, 再把空格处理一下就搞定了. name = re.sub(r'[A-Za-z\-]{1,2}\.|,|and', '', my_match.group()) new_name = name.replace(' ', ' ') while len(new_name) != len(name): name = new_name new_name = name.replace(' ', ' ') 最后把信息组合一下, 按提取出来的作者姓名排序即可. # 组合后再排序 list_sorted = sorted(zip(list_id, list_text, list_short), key=lambda x: x[2]) 最后一些输出的东西就没啥好说的了, 想咋整就咋整. # 三. 打包 首先用命令行跳转到程序所在目录: cd C:\Users\... 再运行打包程序: pyinstaller -F -i favicon.ico main.py 打包看起来简单, 实际操作中会有很多问题的, 说多了都是泪, 只能说与 bug 相伴是程序员的宿命. [源代码](053/main.py) [exe文件](053/main.zip)

标签


32 篇
6 篇
3 篇
2 篇
8 篇
3 篇

朋友的博客


归档


7 篇
2 篇
7 篇
20 篇
9 篇
9 篇