Python difflib与正则表达式

3

我可以在difflib中使用正则表达式吗?

具体来说,我想要做的是:

difflib.context_diff(actual, gold)

实际情况是:

[master 92a406f] file modified

黄金的含义是:

\[master \w{7}\] file modified

你在尝试做什么?在我看来,你只是想将实际内容与黄金正则表达式匹配。为什么要使用difflib呢? - Michael
3个回答

3

看起来你想忽略实际文件中的92a406f部分。你应该编写一个使用正则表达式清除你想忽略的部分的清洁工:

actual = re.sub(r"\[master \w{7}\]", "[master *******]", actual)

然后存储清洗过的金文件。接下来,您可以使用标准的difflib将清洗后的实际文件与清洗后的金文件进行比较。


3
如果您真的想追求基于正则表达式的差异比较,那么您可以创建自己的类似字符串的对象,该对象基于正则表达式匹配定义__eq__方法,并在这些对象的序列上使用difflib。不过我不建议这样做。

你好,你如何处理比较呢?因为源代码只是逐个字符比较,并没有提供字符范围:a[besti-1] == b[bestj-1]a[besti+bestsize] == b[bestj+bestsize] - Julio

2
我刚刚所做的是:将difflib中的find_longest_match函数替换为一份副本,但将==调用替换为一个检查调用,当事物不相等时,尝试将左侧解释为正则表达式(并在任何错误时返回true,例如当它不是有效的正则表达式时)。
我正在将其用于单元测试预期输出匹配,并且目前效果非常好。

2
你好,我对你的解决方案很感兴趣。你能否在你的帖子中编辑你的补丁?看起来你改变了以下几行代码:a[besti-1] == b[bestj-1]a[besti+bestsize] == b[bestj+bestsize],但是self.b2j呢? - Julio
@Julio:不幸的是,这个补丁现在在我不再工作的公司。但是,据我所知,它只是==替换,我不记得有任何关于b2j的操作(这可能意味着我的代码存在漏洞,但是在那些日子里它能够满足我的需求)。 - PlasmaHH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接