Найти специальный ascii в строке [duplicate]

Вы можете создать defaultdict

from collections import defaultdict
d1 = defaultdict(int)      # defaults to 0 values for keys
unq = set(lst1)              # lst1 = [1, 2, 2, 3, 4, 1, 2, 7]
for each in unq:
      d1[each] = lst1.count(each)
else:
      print(d1)
40
задан Martijn Pieters 4 February 2013 в 21:22
поделиться

5 ответов

Удалите их с регулярным выражением:

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'

(я прибрал выражение escape-последовательности, чтобы следовать обзор Wikipedia из escape-кодов ANSI , фокусируясь на последовательностях CSI и игнорируя коды C1, поскольку они никогда не используются в сегодняшнем мире UTF-8).

73
ответ дан Martijn Pieters 19 August 2018 в 04:09
поделиться
  • 1
    Строка ansi_escape.sub ('', sometext) должна быть назначена вашей конечной переменной. – crafter 4 February 2018 в 15:14
  • 2
    @crafter: это подразумевается, да. – Martijn Pieters♦ 4 February 2018 в 15:23

Функция

На основе ответа Martijn Pieters ♦ с регулярным выражением Джеффа .

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()
16
ответ дан Édouard Lopez 19 August 2018 в 04:09
поделиться
  • 1
    Почему вы оставили escape-код / в секундах до последнего набора символов [ -\/]? – Andrew Gelnar 10 August 2016 в 12:04
  • 2
    @AndrewGelnar @ ÉdouardLopez [ -/] будет достаточно. – Rodrigo Martins 1 October 2017 в 19:09
-1
ответ дан Community 19 August 2018 в 04:09
поделиться

В принятом ответе на этот вопрос учитываются только цветные и шрифтовые эффекты. Есть много последовательностей, которые не заканчиваются на «m», например, на позиции позиционирования курсора, стирания и прокрутки.

Полное регулярное выражение для контрольных последовательностей (аналогично ANSI Escape Sequences) -

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

Обратитесь к ECMA-48 Раздел 5.4 и код выхода ANSI

35
ответ дан Jeff 19 August 2018 в 04:09
поделиться
  • 1
    – Thomas Dickey 29 July 2016 в 21:59
  • 2
    OSC находится в ECMA-48 сек. 5.6 - Какой смысл принести это здесь? – Jeff 4 August 2016 в 01:36
  • 3
    OSC является «управляющей последовательностью ANSI», часто используется и начинается с другого шаблона. Ваш ответ неполный . – Thomas Dickey 4 August 2016 в 07:57
  • 4
    Это не работает для цветовых кодов, созданных с помощью bluetoothctl, например: \x1b[0;94m. Сделать регистр выражения нечувствительным или заменить 1B на 1b в шаблоне не имеет значения. Я использую Python и строку re.compile(r'/(\x9b|\x1b\[)[0-?]*[ -\/]*[@-~]/', re.I). Затем я делаю pattern.sub("", my_string), который ничего не выполняет. Я делаю что-то неправильно? – Hubro 30 December 2016 в 09:11
  • 5
    (Я слишком медленно редактировал свой предыдущий комментарий). Я предполагаю, что ваш шаблон использует функции, недоступные в модуле re Python? – Hubro 30 December 2016 в 09:18

Предложенное регулярное выражение не помогло мне, поэтому я создал один из своих. Следующее - это регулярное выражение python, созданное мной на основе найденного spec здесь

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 .com page)

\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

Надеюсь, это поможет другим:)

6
ответ дан kfir 19 August 2018 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: