python मैं पायथन में एक स्ट्रिंग से एएनएसआई एस्केप अनुक्रम कैसे हटा सकता हूं




string escaping (4)

यह मेरी स्ट्रिंग है:

'ls\r\n\x1b[00m\x1b[01;31mexamplefile.zip\x1b[00m\r\n\x1b[01;31m'

मैं एक एसएसएच कमांड से आउटपुट पुनर्प्राप्त करने के लिए कोड का उपयोग कर रहा था और मैं चाहता हूं कि मेरी स्ट्रिंग में केवल 'examplefile.zip'

अतिरिक्त भागने के दृश्यों को हटाने के लिए मैं क्या उपयोग कर सकता हूं?


नियमित अभिव्यक्ति के साथ उन्हें हटाएं:

import re

ansi_escape = re.compile(r'\x1B\[[0-?]*[ -/]*[@-~]')
ansi_escape.sub('', sometext)

डेमो:

>>> import re
>>> ansi_escape = re.compile(r'\x1B\[[0-?]*[ -/]*[@-~]')
>>> sometext = 'ls\r\n\x1b[00m\x1b[01;31mexamplefile.zip\x1b[00m\r\n\x1b[01;31m'
>>> ansi_escape.sub('', sometext)
'ls\r\nexamplefile.zip\r\n'

(मैंने एएसएसआई एस्केप कोडों के विकिपीडिया अवलोकन का पालन करने , सीएसआई अनुक्रमों पर ध्यान केंद्रित करने और सी 1 कोडों को अनदेखा करने के लिए भागने अनुक्रम अभिव्यक्ति को पूरा किया है क्योंकि इन्हें आज की यूटीएफ -8 दुनिया में कभी भी उपयोग नहीं किया जाता है)।


इस प्रश्न का स्वीकार्य उत्तर केवल रंग और फ़ॉन्ट प्रभावों को मानता है। ऐसे कई अनुक्रम हैं जो 'एम' में समाप्त नहीं होते हैं, जैसे कि कर्सर पोजिशनिंग, मिटाना और स्क्रॉल क्षेत्र।

नियंत्रण अनुक्रमों के लिए पूर्ण regexp (उर्फ एएनएसआई एस्केप अनुक्रम) है

/(\x9B|\x1B\[)[0-?]*[ -\/]*[@-~]/

ईसीएमए -48 धारा 5.4 और एएनएसआई एस्केप कोड का संदर्भ लें


सुझाए गए रेगेक्स ने मेरे लिए चाल नहीं की है इसलिए मैंने अपना खुद का निर्माण किया। निम्नलिखित एक पाइथन रेगेक्स है जिसे मैंने here पाया गया नमूना के आधार पर बनाया here

ansi_regex = r'\x1b(' \
             r'(\[\??\d+[hl])|' \
             r'([=<>a-kzNM78])|' \
             r'([\(\)][a-b0-2])|' \
             r'(\[\d{0,2}[ma-dgkjqi])|' \
             r'(\[\d+;\d+[hfy]?)|' \
             r'(\[;?[hf])|' \
             r'(#[3-68])|' \
             r'([01356]n)|' \
             r'(O[mlnp-z]?)|' \
             r'(/Z)|' \
             r'(\d+)|' \
             r'(\[\?\d;\d0c)|' \
             r'(\d;\dR))'
ansi_escape = re.compile(ansi_regex, flags=re.IGNORECASE)

मैंने निम्नलिखित स्निपेट पर अपने रेगेक्स का परीक्षण किया (मूल रूप से ascii-table.com पृष्ठ से एक कॉपी पेस्ट)

\x1b[20h    Set
\x1b[?1h    Set
\x1b[?3h    Set
\x1b[?4h    Set
\x1b[?5h    Set
\x1b[?6h    Set
\x1b[?7h    Set
\x1b[?8h    Set
\x1b[?9h    Set
\x1b[20l    Set
\x1b[?1l    Set
\x1b[?2l    Set
\x1b[?3l    Set
\x1b[?4l    Set
\x1b[?5l    Set
\x1b[?6l    Set
\x1b[?7l    Reset
\x1b[?8l    Reset
\x1b[?9l    Reset
\x1b=   Set
\x1b>   Set
\x1b(A  Set
\x1b)A  Set
\x1b(B  Set
\x1b)B  Set
\x1b(0  Set
\x1b)0  Set
\x1b(1  Set
\x1b)1  Set
\x1b(2  Set
\x1b)2  Set
\x1bN   Set
\x1bO   Set
\x1b[m  Turn
\x1b[0m Turn
\x1b[1m Turn
\x1b[2m Turn
\x1b[4m Turn
\x1b[5m Turn
\x1b[7m Turn
\x1b[8m Turn
\x1b[1;2    Set
\x1b[1A Move
\x1b[2B Move
\x1b[3C Move
\x1b[4D Move
\x1b[H  Move
\x1b[;H Move
\x1b[4;3H   Move
\x1b[f  Move
\x1b[;f Move
\x1b[1;2    Move
\x1bD   Move/scroll
\x1bM   Move/scroll
\x1bE   Move
\x1b7   Save
\x1b8   Restore
\x1bH   Set
\x1b[g  Clear
\x1b[0g Clear
\x1b[3g Clear
\x1b#3  Double-height
\x1b#4  Double-height
\x1b#5  Single
\x1b#6  Double
\x1b[K  Clear
\x1b[0K Clear
\x1b[1K Clear
\x1b[2K Clear
\x1b[J  Clear
\x1b[0J Clear
\x1b[1J Clear
\x1b[2J Clear
\x1b5n  Device
\x1b0n  Response:
\x1b3n  Response:
\x1b6n  Get
\x1b[c  Identify
\x1b[0c Identify
\x1b[?1;20c Response:
\x1bc   Reset
\x1b#8  Screen
\x1b[2;1y   Confidence
\x1b[2;2y   Confidence
\x1b[2;9y   Repeat
\x1b[2;10y  Repeat
\x1b[0q Turn
\x1b[1q Turn
\x1b[2q Turn
\x1b[3q Turn
\x1b[4q Turn
\x1b<   Enter/exit
\x1b=   Enter
\x1b>   Exit
\x1bF   Use
\x1bG   Use
\x1bA   Move
\x1bB   Move
\x1bC   Move
\x1bD   Move
\x1bH   Move
\x1b12  Move
\x1bI  
\x1bK  
\x1bJ  
\x1bZ  
\x1b/Z 
\x1bOP 
\x1bOQ 
\x1bOR 
\x1bOS 
\x1bA  
\x1bB  
\x1bC  
\x1bD  
\x1bOp 
\x1bOq 
\x1bOr 
\x1bOs 
\x1bOt 
\x1bOu 
\x1bOv 
\x1bOw 
\x1bOx 
\x1bOy 
\x1bOm 
\x1bOl 
\x1bOn 
\x1bOM 
\x1b[i 
\x1b[1i
\x1b[4i
\x1b[5i

उम्मीद है कि यह दूसरों की मदद करेगा :)


समारोह

जेफ के रेगेक्स के साथ मार्टिजन पीटर्स के उत्तर के आधार पर।

def escape_ansi(line):
    ansi_escape = re.compile(r'(\x9B|\x1B\[)[0-?]*[ -/]*[@-~]')
    return ansi_escape.sub('', line)

परीक्षा

def test_remove_ansi_escape_sequence(self):
    line = '\t\u001b[0;35mBlabla\u001b[0m                                  \u001b[0;36m172.18.0.2\u001b[0m'

    escaped_line = escape_ansi(line)

    self.assertEqual(escaped_line, '\tBlabla                                  172.18.0.2')

परिक्षण

यदि आप इसे अपने आप से चलाने के लिए चाहते हैं, तो python3 (बेहतर यूनिकोड समर्थन, blablabla) का उपयोग करें। यहां बताया गया है कि परीक्षण फ़ाइल कैसे होनी चाहिए:

import unittest
import re

def escape_ansi(line):
    …

class TestStringMethods(unittest.TestCase):
    def test_remove_ansi_escape_sequence(self):
    …

if __name__ == '__main__':
    unittest.main()




ansi-escape