gpt4 book ai didi

python - 对 2 个文本执行差异,仅使用文本中每一行的一部分

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:24:57 26 4
gpt4 key购买 nike

我有两个文本。

T0 ID A
T1 ID B
T2 ID C
T4 ID D

T5 ID A
T6 ID E
T7 ID F
T8 ID D

我真的只对比较 ID 字母序列的差异感兴趣。但是我想在输出中保留每个元素的第一部分,这样我以后可以将它用于其他分析,即输出看起来像这样

@-1,2 +1,2
-T2 ID B
-T3 ID C
+T6 ID E
+T7 ID F

进行这种比较的最佳方法是什么?理想情况下使用 difflib python 库。

此外,我有 2 个对象列表,而不是 2 个文本,每个对象都有 2 个属性(object.t 返回 T1,object.ID 返回 B),我只想对对象列表执行差异关于他们的 ID 属性。我可以执行这样的操作吗?也许这应该是一个不同的问题。

谢谢

最佳答案

你可以创建一个 str 的子类来散列和比较,就像它只包含它的 ID 一样:

import re

class IdString(str):
"""A string that hashes and compares on its id.

>>> hash(IdString('XXX ID A XXX')) == hash('A')
True
>>> hash(IdString('XXX ID abc XXX')) == hash('abc')
True
>>> IdString('XXX ID A XXX') == IdString('YYY ID A YYY')
True
>>> IdString('XXX ID A XXX') == IdString('XXX ID B XXX')
False

"""
def __new__(cls, *args):
self = super(IdString, cls).__new__(cls, *args)
m = re.search(r'\bID (\w+)', self)
self.id = m.group(1)
return self

def __hash__(self):
return hash(self.id)

def __eq__(self, other):
return self.id == other.id

def __ne__(self, other):
return self.id != other.id

然后您可以将您的普通字符串转换为 IdString 对象并将它们传递给 difflib,如下所示:

from difflib import unified_diff

text1 = '''T0 ID A
T1 ID B
T2 ID C
T4 ID D
'''

text2 = '''T5 ID A
T6 ID E
T7 ID F
T8 ID D
'''

print(''.join(unified_diff(map(IdString, text1.splitlines(True)),
map(IdString, text2.splitlines(True)),
n=0)))

它产生的输出非常接近你想要的:

--- 
+++
@@ -2,2 +2,2 @@
-T1 ID B
-T2 ID C
+T6 ID E
+T7 ID F

(您问题中的示例说 @-1,2 +1,2 但我无法完全重现,因为我不知道 diff 的风格和行号diff 输出从 1 开始。)

关于python - 对 2 个文本执行差异,仅使用文本中每一行的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18795607/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com