我正在编写需要能够跟踪修订的脚本。一般的想法是给它一个元组列表,其中第一个条目是字段的名称(即“标题”或“描述”等),第二个条目是该字段的第一个版本,第三个条目是修订版。所以是这样的:
[("Title", "The first version of the title", "The second version of the title")]
现在,使用python docx
我希望我的脚本创建一个 word 文件,该文件将显示原始版本,以及带有粗体更改的新版本。例子:
原标题:
这是标题的第一个版本
修改后的标题:
这是标题的第二个版本
这样做的方法python docx
是创建一个元组列表,其中第一个条目是文本,第二个是格式。所以创建修改后的标题的方法是这样的:
paratext = [("This is the ", ''),("second",'b'),(" version of the title",'')]
最近发现difflib
,我认为这将是一项非常容易的任务。事实上,对于简单的单词替换,例如上面的示例,它是,并且可以使用以下函数来完成:
def revFinder(str1,str2):
s = difflib.SequenceMatcher(None, str1, str2)
matches = s.get_matching_blocks()[:-1]
paratext = []
for i in range(len(matches)):
print "------"
print str1[matches[i][0]:matches[i][0]+matches[i][2]]
print str2[matches[i][1]:matches[i][1]+matches[i][2]]
paratext.append((str2[matches[i][1]:matches[i][1]+matches[i][2]],''))
if i != len(matches)-1:
print ""
print str1[matches[i][0]+matches[i][2]:matches[i+1][0]]
print str2[matches[i][1]+matches[i][2]:matches[i+1][1]]
if len(str2[matches[i][1]+matches[i][2]:matches[i+1][1]]) > len(str1[matches[i][0]+matches[i][2]:matches[i+1][0]]):
paratext.append((str2[matches[i][1]+matches[i][2]:matches[i+1][1]],'bu'))
else:
paratext.append((str1[matches[i][0]+matches[i][2]:matches[i+1][0]],'bu'))
return paratext
当我想做其他事情时,问题就来了。例如,将“teh”更改为“the”会产生h (没有空格,我无法弄清楚格式)。另一个问题是附加到末尾的额外文本不显示为更改(或根本不显示)。
所以,我对你们所有人的问题是,有哪些替代方案difflib
足以处理更复杂的文本比较,或者,我怎样才能difflib
更好地使用它来满足我的需求?提前致谢