我有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
答案 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']