python代码如下:
import docx
from docx import Document
import re
# 排序后的字符串插入word
def insert_to_word(text, filename):
doc = docx.Document(filename)
paragraphs = doc.paragraphs
paragraphs[-1].text +="\n" + text
doc.save(filename)
#获取原文引用参考文献的次序字典
def get_index_order(docx_file):
# 读取word文档
document = Document(docx_file)
# 将所有段落的文本内容合并成一个字符串
text = '\n'.join([para.text for para in document.paragraphs])
# 使用正则表达式匹配方括号中的数字
pattern = re.compile(r'\[(\d+(?:-\d+)?(?:,\d+(?:-\d+)?)*?)\]')
matches = pattern.finditer(text)
# 处理匹配结果,记录先后次序
orders = {}
for match in matches:
index_str = match.group(1)
# 将字符串转换为数字列表
indices = []
for part in index_str.split(','):
if '-' not in part:
indices.append(int(part))
else:
start, end = map(int, part.split('-'))
indices.extend(range(start, end + 1))
# 记录每个数字出现的先后次序
for index in indices:
if index not in orders:
orders[index] = len(orders) + 1
return orders
# 测试
file_path = 'content.docx'
orders = get_index_order(file_path)
print(orders)
#只能用docx而不能是doc,而且不能是空文档------------------------------------
doc = docx.Document('reference.docx')
dct = orders
# 读取文档中所有段落
paragraphs = []
for p in doc.paragraphs:
paragraphs.append(p.text)
s="|".join(paragraphs)
# 将字符串按逗号分隔,并去除方括号
lst = [x.strip('[]') for x in s.split('|')]
# 将方括号序号转换为对应的key,提取序号组成数组,注意最后一段如果是空段落的话会报错
#lst = [int(x[0]) for x in lst] #替换成以下代码,加个判断防止报错
lst2= []
for x in lst:
if len(str(x))==0:#防止空段落
continue
lst2.append(int(x[0:x.index(']')]))
# 按照字典的值进行排序
lst = sorted(lst2, key=lambda x: dct[x])
# 将key转换为方括号序号,并加上括号和原字符串
lst3 = []
for x in lst:
if x == lst2[len(lst2)-1] :
lst3.append('[' + str(x) + ']' + s[ s.index('['+str(x)+']')+len('['+str(x)+']') : ])
else:
lst3.append('[' + str(x) + ']' + s[ s.index('['+str(x)+']')+len('['+str(x)+']') : s.index('['+str(lst2[lst2.index(x)+1])+']')-1])
print('正在重新排序')
for s in lst3:
print(s)
insert_to_word(s, 'reference2.docx')
print('参考文献重新排序完毕!')
注意:要将参考文献单独放在另一个docx文件中,并且和python文件还有原文置于同一目录下,执行python文件之后会在同目录下生成正确排序后的参考文献docx文件,新手需要安装python环境方可使用。
|