Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
忽略python字符串中的制表符和空格_Python_Excel_Python 2.7_Whitespace - Fatal编程技术网

忽略python字符串中的制表符和空格

忽略python字符串中的制表符和空格,python,excel,python-2.7,whitespace,Python,Excel,Python 2.7,Whitespace,我需要比较python中的两个字符串,第一个字符串是从.xlsx文件读取的,第二个是从stdout.readlines()输出的 下面的代码是获取命令输出的代码 stdin, stdout, stderr = client.exec_command(testCommand) op = stdout.readlines() print("op =\n"+str(op)) str1 = "".join(op) 因为有些命令输出以\t开头,或者可能介于\t之间 例如:以下命令输出以\t开头,在LEN

我需要比较python中的两个字符串,第一个字符串是从.xlsx文件读取的,第二个是从stdout.readlines()输出的

下面的代码是获取命令输出的代码

stdin, stdout, stderr = client.exec_command(testCommand)
op = stdout.readlines()
print("op =\n"+str(op))
str1 = "".join(op)
因为有些命令输出以\t开头,或者可能介于\t之间

例如:以下命令输出以\t开头,在LEN之后有\t

#   PASS_MIN_LEN    Minimum acceptable password length.
PASS_MIN_LEN    5
并且xlsx文件具有

# PASS_MIN_LEN Minimum acceptable password length.
PASS_MIN_LEN 5
由于.xlsx比较字符串没有\t,在比较两个字符串时如何忽略\t

if cmdOutput== xlsxOutput:
它不起作用

我试图用\t修剪cmdOutput,但没有效果。
我可以采用什么方法?

您可以将命令输出字符串中的制表符替换为空格

例如:

cmdOutput.replace('\t', ' ') == xlsxOutput
op = [x.replace('\t', ' ').strip() for x in op]
print(op)

['# PASS_MIN_LEN Minimum acceptable password length.', 'PASS_MIN_LEN 5']

如果您只想用空格替换制表符,那么
str.replace
可能足够简单。但这并没有留下尾随的新行。你可以考虑替换,然后是<代码> STR.AdS/<代码>。例如:

cmdOutput.replace('\t', ' ') == xlsxOutput
op = [x.replace('\t', ' ').strip() for x in op]
print(op)

['# PASS_MIN_LEN Minimum acceptable password length.', 'PASS_MIN_LEN 5']
如果您有其他类型的字符或多个字符(缺少数据等),可以考虑使用
re
gex的更积极的方法:

import re
op = [x for x in map(lambda x: re.sub('\s+', ' ', x).strip(), op)]
print(op) 

['# PASS_MIN_LEN Minimum acceptable password length.', 'PASS_MIN_LEN 5']
请阅读官方python文档中的说明

“返回删除前导字符和尾随字符的字符串副本。”

因此,字符串中的字符保持不变。使用replace()方法是解决问题的最佳方法

>>> str1 = "PASS_MIN_LEN\t5"
>>> str2 = "PASS_MIN_LEN 5"
>>> str1.replace('\t', ' ') == str2
True

op
是列表吗?@cᴏʟᴅsᴘᴇᴇᴅ 我99.999999999%肯定是的
stdout
看起来像一个文件,
file.readlines()
返回一个列表。更不用说OP使用了
str.join
@ChristianDean Mhm。。。我想是的。。。我想OP尝试了类似于
str(OP.strip()
)的方法。它是一个列表。[u'#\t密码\t最小可接受密码长度。\n',u'PASS\u MIN_LEN\t5\n']@Sameer所以您想用一个空格替换所有选项卡?与其在每个元素上重复执行
str.replace(…)
,为什么不在整个字符串列表上执行一次呢?是的,在这种情况下,在整个列表中调用replace最有意义。谢谢,这非常有效。我有一个\n介于两者之间。我的xlsx文件有一个新行条目。”#\tPASS\u MIN\u LEN\t可接受的最小密码长度。\n',u'PASS\u MIN\u LEN\t5\n'@COLDSPEED second regex未处理\n。试着把它修好。已经凌晨2点了。@Sameer你确定这是一个新行,而不是后跟n的反斜杠吗?因为如果新行实际上是一行,正则表达式将处理它。@COLDSPEED它不是一个字面上的反斜杠,stdout.readlines()给了我[u'#\t密码\u最小长度\u LEN\t可接受的最小密码长度。\n',u'PASS\u MIN\u LEN\t5\n']并在其上执行“.join()”\n被视为新行。@Sameer向正则表达式中添加一个
flags=re.MULTILINE
<代码>[x代表地图中的x(lambda x:re.sub('\s+','',x,flags=re.M).strip(),op)]