取两个字符串中的元素,然后比较

Take elements that are in both strings, then compare

我有两个字符串:

machine1 19968MB 15375MB 23%                    
machine2 79872MB 61501MB 23%                    
machine3 798720MB 615014MB 23% 
machine1 9968MB 15375MB 13%                    
machine2 19872MB 61501MB 33%                    
machine4 798720MB 615014MB 23% 

我想比较两个字符串中存在的所有机器,为此,我正在这样做:

pat = 'machine_\S+'
machines1 = re.findall(pat, string1)
machines2 = re.findall(pat, string2)
intersect = set(machines1) & set(machines2)
newstring1 = '\n'.join(line for line in string1.splitlines() if
                       re.search(pat, line).group() in intersect)
newstring2 = '\n'.join(line for line in string2.splitlines() if
                       re.search(pat, line).group() in intersect)

Newstring1 应该是这样的:

machine1 19968MB 15375MB 23%                    
machine2 79872MB 61501MB 23% 

和 Newstring2 这个:

machine1 9968MB 15375MB 13%                    
machine2 19872MB 61501MB 33% 

但问题是,有时,这些机器的名称可能会更改为另一种格式,而正则表达式无法做到这一点..

其他格式的示例(可以是任何格式,我认为正则表达式不是解决方案):

test_volume1 19968MB 15375MB 23% 
testing_nfs 19968MB 15375MB 23% 

有没有办法做到这一点,但不使用正则表达式?

如果您的机器名称总是在行的开头,您可以使用 line.split(" ")[0] 来获取机器名称。

machines1 = [line.split(" ")[0] for line in string1.splitlines()]
machines2 = [line.split(" ")[0] for line in string2.splitlines()]
intersect = set(machines1) & set(machines2)
newstring1 = '\n'.join(line for line in string1.splitlines() if
                       line.split(" ")[0] in intersect)
newstring2 = '\n'.join(line for line in string2.splitlines() if
                       line.split(" ")[0] in intersect)

您可以做的是获取每行的第一个单词:

machines1 = [line.split()[0] for line in string1.splitlines()]
machines2 = [line.split()[0] for line in string2.splitlines()]

如果单词是 space 分隔的,这应该可以解决问题,否则,您可以在 .split()

中精确分隔