2017-01-17 12 views
1

coloramaを使用してANSIコードをテキストに追加すると、ANSIカラーコードをテキストから分割してテキストを列フォーマットで印刷できるようにする必要があります。次の式は、単一のカラーコードをテキストから分離しますが、ダブルコードは分離しません。ANSIエスケープ文字をテキストから分離するための正規表現

# adapted from https://stackoverflow.com/questions/2186919 
split_ANSI_escape_sequences = re.compile(r""" 
    (?P<col> 
    \x1b  # literal ESC 
    \[  # literal [ 
    [;\d]* # zero or more digits or semicolons 
    [A-Za-z] # a letter 
    )* 
    (?P<text>.*) 
    """, re.VERBOSE).fullmatch 

def split_ANSI(s): 
    return split_ANSI_escape_sequences(s).groupdict() 

これが結果です:

>>> split_ANSI('\x1b[31m\x1b[1mtext') 
{'col': '\x1b[1m', 'text': 'text'} 

それは正しく分割しますが、フォーマット情報を失います。私は期待している

{'col': '\x1b[31m\x1b[1m', 'text': 'text'} 

結果として。

最初のグループのすべての潜在的なエスケープシーケンスを取得するにはどうすればよいですか?

+0

希望の出力は何ですか? – martineau

+0

{'col': '\ x1b [31m \ x1b [1m'、 'text': 'text'} –

+1

あなたの質問を編集して追加してください。 – martineau

答えて

0

私は答えをPython RegEx multiple groupsで見つけました。

最初の名前付きグループは、各マッチによって上書きされます。このバージョンの作品:

split_ANSI_escape_sequences = re.compile(r""" 
    (?P<col>(\x1b  # literal ESC 
    \[  # literal [ 
    [;\d]* # zero or more digits or semicolons 
    [A-Za-z] # a letter 
    )*) 
    (?P<name>.*) 
    """, re.VERBOSE).match 

def split_ANSI(s): 
    return split_ANSI_escape_sequences(s).groupdict() 
関連する問題