2

我々は持っています:

>>> str
'exit\r\ndrwxr-xr-x    2 root     root            0 Jan  1  2000 
\x1b[1;34mbin\x1b[0m\r\ndrwxr-xr-x    3 root     root           
0 Jan  1  2000 \x1b[1;34mlib\x1b[0m\r\ndrwxr-xr-x   10 root     
root            0 Jan  1  1970 \x1b[1;34mlocal\x1b[0m\r\ndrwxr-xr-x    
2 root     root            0 Jan  1  2000 \x1b[1;34msbin\x1b[0m\r\ndrwxr-xr-x    
5 root     root            0 Jan  1  2000 \x1b[1;34mshare\x1b[0m\r\n# exit\r\n'

>>> print str
exit
drwxr-xr-x    2 root     root            0 Jan  1  2000 bin
drwxr-xr-x    3 root     root            0 Jan  1  2000 lib
drwxr-xr-x   10 root     root            0 Jan  1  1970 local
drwxr-xr-x    2 root     root            0 Jan  1  2000 sbin
drwxr-xr-x    5 root     root            0 Jan  1  2000 share
# exit

正規表現を使用して、すべての'\xblah[0m'ナンセンスを取り除きたい。私はもう試した

re.sub(str, r'(\x.*m)', '')

しかし、それはうまくいきませんでした。何か案は?

4

5 に答える 5

11

いくつかの問題があります:

  • re.sub に引数を間違った順序で渡しています。そのはず:

    re.sub(regexp_pattern, replacement, source_string)

  • 文字列に「\x」が含まれていません。その「\x1b」はエスケープ文字で、1 文字です。

  • interjay が指摘したように、「.*?」が必要です。そうしないと、最初のエスケープから最後の「m」までのすべてに一致するためです。

re.sub の正しい呼び出しは次のとおりです。

print re.sub('\x1b.*?m', '', s)

または、次を使用できます。

print re.sub('\x1b[^m]*m', '', s)
于 2009-12-02T16:17:08.867 に答える
3

次の変更が必要です。

  • バックスラッシュをエスケープする
  • 非貪欲なマッチングに切り替えます。そうしないと、最初\xと最後の間のすべてmが削除されます。これは、複数のオカレンスがある場合に問題になります。
  • 引数の順序が正しくありません

結果:

re.sub(r'(\\x.*?m)', '', str)
于 2009-12-02T16:09:31.927 に答える
3

これらはANSI 端末コードです。それらは、ESC (バイト 27、Python では として表示\x1B) の後に[、次にいくつか;の - で区切られたパラメーター、最後にそれがどのコマンドであるかを指定する文字によって通知されます。(mはカラーチェンジです。)

パラメータは通常数値であるため、この単純なケースでは、次のようにしてそれらを取り除くことができます。

ansisequence= re.compile(r'\x1B\[[^A-Za-z]*[A-Za-z]')
ansisequence.sub('', string)

技術的には、一部の (色に関係のない) 制御コードの場合、それらは一般的な文字列である可能性があり、解析が煩わしくなります。これらに遭遇することはめったにありませんが、遭遇した場合は、次のような複雑なものを使用する必要があると思います:

\x1B\[((\d+|"[^"]*")(;(\d+|"[^"]*"))*)?[A-Za-z]

文字列を生成しているものは何でも、ANSI端末ではないことを説得するのが最善であるため、出力にカラーコードを含めないでください。

于 2009-12-02T17:54:51.703 に答える
2

代わりに実行してみてくださいls --color=never -l。そもそも ANSI エスケープ コードを取得できません。

于 2009-12-02T19:13:38.747 に答える
1

これらの厄介なエスケープシーケンスの一般的な解析式を使用して、問題の解析ソリューションを次に示します。抑制された式で最初の文字列を変換することにより、これは式のすべての一致を取り除いた文字列を返します。

s = \
'exit\r\ndrwxr-xr-x    2 root     root            0 Jan  1  2000 ' \
'\x1b[1;34mbin\x1b[0m\r\ndrwxr-xr-x    3 root     root           ' \
'0 Jan  1  2000 \x1b[1;34mlib\x1b[0m\r\ndrwxr-xr-x   10 root     ' \
'root            0 Jan  1  1970 \x1b[1;34mlocal\x1b[0m\r\ndrwxr-xr-x    ' \
'2 root     root            0 Jan  1  2000 \x1b[1;34msbin\x1b[0m\r\ndrwxr-xr-x    ' \
'5 root     root            0 Jan  1  2000 \x1b[1;34mshare\x1b[0m\r\n# exit\r\n' \

from pyparsing import (Literal, Word, nums, Combine, 
    delimitedList, oneOf, alphas, Suppress)

ESC = Literal('\x1b')
integer = Word(nums)
escapeSeq = Combine(ESC + '[' + delimitedList(integer,';') + oneOf(list(alphas)))

s_prime = Suppress(escapeSeq).transformString(s)

print s_prime

これにより、に保存されている目的の出力が出力されs_primeます。

于 2009-12-02T18:06:41.127 に答える