Python脚本日志字符串长度异常与匹配失败问题排查
问题诊断与解决方案
核心原因:隐藏的ANSI终端控制字符
你遇到的长度不符、匹配失败问题,本质是从终端获取的日志内容里包含了ANSI控制字符——这些是用来给文本设置颜色(比如你看到的红色部分)、格式的隐藏字符,它们不会在终端显示,但会被算入字符串的实际长度中,导致视觉上内容一致,但实际字符串包含额外的不可见代码,所以==匹配始终返回False。
解决步骤:移除ANSI控制字符
我们可以用正则表达式精准匹配并移除所有ANSI控制字符,只保留可见的文本内容。具体操作如下:
- 导入正则模块:在脚本开头添加
import re - 编写移除控制字符的工具函数:
def remove_ansi_escape_codes(s): # 正则匹配所有ANSI escape序列 ansi_pattern = re.compile(r'\x1B(?:[@-Z\\-_]|\[.*?[a-zA-Z])') return ansi_pattern.sub('', s)
- 处理获取到的日志字符串:在你提取
Cmd_Out1a之后,调用这个函数清理内容:
Cmd_Out1a = Cmd.before Cmd_Out1a = Cmd_Out1a.splitlines()[-3] # 清理ANSI控制字符 Cmd_Out1a = remove_ansi_escape_codes(Cmd_Out1a)
修改后的完整代码
from pexpect import pxssh import pexpect import time import re def remove_ansi_escape_codes(s): ansi_pattern = re.compile(r'\x1B(?:[@-Z\\-_]|\[.*?[a-zA-Z])') return ansi_pattern.sub('', s) def Login_Server(hostip,user,passwd): User_Info_out = [] Cmd_Out = ' ' try: Cmd = pxssh.pxssh() Cmd.login(hostip, user, passwd) Cmd_Out = Execute_Script4(Cmd) except pxssh.ExceptionPxssh as e: User_Info_out = 'None' return User_Info_out,Cmd_Out def Execute_Script4(Cmd): Cmd_Out1a,Cmd_Out_str1,Cmd_Out1b = " ", " ", " " sub_str1 = "abc-xyz: Attach Complete is about to be sent for jk 2" Cmd.sendline('sudo su') Cmd.prompt() Cmd.sendline('log command') time.sleep(3) Cmd.sendcontrol('c') Cmd.prompt() Cmd_Out1a = Cmd.before Cmd_Out1a = Cmd_Out1a.splitlines()[-3] # 清理控制字符 Cmd_Out1a = remove_ansi_escape_codes(Cmd_Out1a) print(Cmd_Out1a) print(type(Cmd_Out1a)) print(len(Cmd_Out1a)) print(len(sub_str1)) # 现在可以正常验证匹配了 print("匹配结果:", Cmd_Out1a == sub_str1) Login_Server('XXX.XXX.X.XX','usera','password')
为什么之前的方法没用?
rstrip()只能移除字符串末尾的空白字符(空格、换行、制表符),但ANSI控制字符可能插在文本中间(比如颜色切换的代码),所以无法清理干净。- 切片操作异常是因为控制字符打乱了实际字符索引,视觉上的字符位置和实际字符串的索引不对应,导致切片结果不符合预期。
内容的提问来源于stack exchange,提问作者Lakshanth C
相关产品推荐
相关产品推荐

