簡體   English   中英

調試Python函數以刪除ANSI代碼

[英]Debugging a Python function to remove ANSI codes

我的問題實際上有兩部分。 我編寫了一個函數,可以通過簡單替換從字符串中刪除ANSI代碼,但是該函數將按原樣返回字符串。 我嘗試使用pdb進行調試,但結果沒有意義,因為好像Python本身存在故障。 但是我對此表示懷疑,因此我試圖找出代碼中沒有出現的錯誤。 我也想知道是否有更好的方法可以刪除(可能尚未看到)ANSI代碼,而無需每次都修改函數。

這是令我感到困惑的pdb屏幕快照:函數調試的pdb屏幕截圖

n_text未設置, 目標設置為怪異的東西,執行行指針以某種方式設置為不可執行的行(157)。 使用re而不是string.replace時,出現了類似的錯誤。

該功能是

def clean_ansi(text, remove=''):
    # remove ANSI control codes
    n_text = text
    targets = [''.join([chr(cde) for cde in [27, 91, 67]]),
               ''.join([chr(cde) for cde in [27, 91, 48, 109]]),
               ''.join([chr(cde) for cde in [27, 91, 49, 109]])]

    for target in targets:
        n_text = n_text.replace(target, '')
    return n_text

對於此示例,我要清除的字符串是

'?-人(socrates)\\ n \\ x1b [C \\ x1b [C \\ x1b [C \\ x1b [C \\ x1b [C \\ x1b [C \\ x1b [C \\ x1b [C \\ x1b [C \\ x1b [C \\ x1b [C \\ x1b [C \\ x1b [C \\ x1b [C \\ x1b [C \\ x1b [C \\ x1b [C \\ x1b [C. \\ n \\ x1b [1mtrue。\\ x1b [0m \\ n \\ n?-'

預期收益為

'?-人(socrates)\\ n。\\ ntrue。\\ n \\ n?-'

放到上下文中,這是創建命令行IDE的項目的一部分,當將查詢傳遞到SWI-Prolog實例(通過pexpect)並且將輸出解析為僅給出實際結果時,就會發生此特定問題,這是真的。 在這種情況下。

您的代碼應從顯示的字符串中清除ANSI代碼,您確定調用正確嗎?

無論哪種方式,它都只會剝離選定的代碼,並且不是一種特別優雅或高效的方式-我建議您使用regex並省去一些麻煩:

import re

ANSI_CLEANER = re.compile(r"(\x9B|\x1B\[)[0-?]*[ -/]*[@-~]")

clean_string = ANSI_CLEANER.sub("", your_string)

print(repr(clean_string))
# prints '?- human(socrates)\n.\ntrue.\n\n?- '

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM