# 参考文献排序
---
苦参考文献排序久已, 如今终于有时间写个脚本自动排序了
(或许改用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)