具有“ ls -l <​​>”输出的字符串的Python比较

时间:2019-06-06 09:00:25

标签: python

我有2个包含数据的字符串:

str 1 = '''ls /var/crash
bbb-metro-3542-1559557457.core.gz    cesd-pslm-4456-1559557475.core.gz
bbb-metro-3542-1559557457.txt        cesd-pslm-4456-1559557475.txt
bbb-metro.20190603.102417+0000.3542  cesd-pslm.20190603.095937+0000.3717
cesd-pslm-3717-1559555977.core.gz    cesd-pslm.20190603.102435+0000.4456
cesd-pslm-3717-1559555977.txt        old
bash-4.1#
'''
str2= '''ls /var/crash
bbb-metro-3542-1559557457.core.gz    cesd-pslm-4456-1559557475.core.gz
bbb-metro-3542-1559557457.txt        cesd-pslm-4456-1559557475.txt
bbb-metro.20190603.102417+0000.3542  cesd-pslm.20190603.095937+0000.3717
cesd-pslm-3717-1559555977.core.gz    cesd-pslm.20190603.102435+0000.4456
cesd-pslm-3717-1559555977.txt        old
'''

现在我想比较这两个字符串并打印出差异。

在运行期间,Str1和Str2也会发生变化,因为在函数调用期间从“ ls -l”命令中保存了值。

如何比较这两个字符串?差异需要保存在另一个字符串中,因为然后我会将其传递给函数以获取值。

我正在通过将变量类型更改为list进行尝试,但是它不起作用。

   def ls_output(card)
       pxr_crash = self.send_card_cmd(
          card, "ls /var/crash")
      pxr_old = self.send_card_cmd(
          card, "ls /var/crash/old")
      return pxr_crash.resp,pxr_old.resp

返回值分别是str1和str2。

I am expecting is str1 = '''ls -l /stat
-r--r--r--  1 root  root          0 Jun  6 08:56 version
-r--------  1 root  root          0 Jun  6 08:56 vmallocinfo
'''
and str2 = '''ls -l /stat
-r--r--r--  1 root  root          0 Jun  6 08:56 version
-r--------  1 root  root          0 Jun  6 08:56 vmallocinfo
-r--------  1 root  root          0 Jun  6 08:56 zone
'''

所以我应该得到

-r--------  1 root  root          0 Jun  6 08:56 zone

5 个答案:

答案 0 :(得分:1)

您可以将字符串拆分为行列表,并检查str1的行列表中str2的每一行

您还可以将行列表转换为set()并执行set2 - set1以获取新元素。

str1 = '''ls -l /stat
-r--r--r--  1 root  root          0 Jun  6 08:56 version
-r--------  1 root  root          0 Jun  6 08:56 vmallocinfo
'''

str2 = '''ls -l /stat
-r--r--r--  1 root  root          0 Jun  6 08:56 version
-r--------  1 root  root          0 Jun  6 08:56 vmallocinfo
-r--------  1 root  root          0 Jun  6 08:56 zone
'''

set1 = set(str1.split('\n'))
set2 = set(str2.split('\n'))

print(set2-set1)

# {'-r--------  1 root  root          0 Jun  6 08:56 zone'}

您还可以选中set1 - set2以获取已删除的元素。

print(set1-set2)

# set() 

set()不必保持元素的顺序,因此,如果您有很多差异,则每次运行它们的顺序都可以不同。您可能必须转换回列表,并在每次运行时使用sorted()以相同的顺序获取列表。

答案 1 :(得分:0)

str1 = '''ls -l /stat
-r--r--r--  1 root  root          0 Jun  6 08:56 version
-r--------  1 root  root          0 Jun  6 08:56 vmallocinfo
'''


str2 = '''ls -l /stat
-r--r--r--  1 root  root          0 Jun  6 08:56 version
-r--------  1 root  root          0 Jun  6 08:56 vmallocinfo
-r--------  1 root  root          0 Jun  6 08:56 zone
'''

#list containing all the lines in str1 not present in str2
l1 = [i for i in str1.split('\n') if i not in str2.split('\n')]
#list containing all the lines in str2 not present in str1
l2 = [i for i in str2.split('\n') if i not in str1.split('\n')]

#printing all the diff lines (l1+l2)
for i in l1 + l2:
    print(i)

答案 2 :(得分:0)

您可以像这样使用列表理解:

def diff(l1, l2):
  return [x for x in l1 if x not in l2] + [x for x in l2 if x not in l1]

diff(str1.splitlines(), str2.splitlines())

diff的结果将包含仅在两个字符串之一中的行

答案 3 :(得分:0)

我认为stdlib的difflib是您的朋友。

https://docs.python.org/3.6/library/difflib.html#module-difflib

答案 4 :(得分:0)

下面的代码可能会有所帮助:

str1 = '''ls -l /stat
-r--r--r--  1 root  root          0 Jun  6 08:56 version
-r--------  1 root  root          0 Jun  6 08:56 vmallocinfo
'''
str2= '''ls -l /stat
-r--r--r--  1 root  root          0 Jun  6 08:56 version
-r--------  1 root  root          0 Jun  6 08:56 vmallocinfo
-r--------  1 root  root          0 Jun  6 08:56 zone
'''

# convert string to list, spliting by '\n'
str1 = str1.split('\n')
str1 = list(filter(None, str1))
print('---str1---')
print(str1)

str2 = str2.split('\n')
str2 = list(filter(None, str2))

# get the difference
str1sub = [x for x in str1 if x not in str2]
str2sub = [x for x in str2 if x not in str1]

print('\n---result---')
print(str1sub)
print(str2sub)

输出如下:

---str1---
['ls -l /stat', '-r--r--r--  1 root  root          0 Jun  6 08:56 version', '-r--------  1 root  root          0 Jun  6 08:56 vmallocinfo']

---result---
[]
['-r--------  1 root  root          0 Jun  6 08:56 zone']