Прочитать список плохих данных UTF из файла в Python и сравнить его со строкой - PullRequest
0 голосов
/ 27 июня 2018

Давайте у меня будет эта последовательность символов

>>> '\xed\xba\xbd'
'íº½'

My conf_file содержит список этих строк, которые необходимо сравнить, если они присутствуют в строке и должны быть исключены.

$cat excl_char_seq.lst
\xed\xba\xbd
\xed\xa9\x81
\xed\xba\x91

Вот мой код для сравнения, если строка содержит любую из этих последовательностей.

v_conf_file = 'excl_char_seq.lst'   
with open(v_conf_file) as f:
     seqlist = f.read().splitlines()
line = 'weríº½66'
print ([ 1 for seqs in seqlist if seqs in line ])

Но распечатанный список из приведенного выше кода пуст .

Когда я напечатал seqlist, я получил следующий вывод, который, похоже, избежал последовательности с помощью «\».

['\\xed\\xba\\xbd', '\\xed\\xa9\\x81', '\\xed\\xba\\x91' ]

Как мне исправить код, чтобы он соответствовал строке с содержимым файла?

1 Ответ

0 голосов
/ 27 июня 2018

Проблема в том, что строка, которую вы прочитали из файла, на самом деле содержит 12 символов: \, x, e, d, \, x, b, a, \, x, b и d, и вы хотите преобразовать это в 3 символа '\xed', '\xba' и' \xbd'. Здесь могут помочь регулярные выражения для идентификации экранированных символов, начинающихся с \x:

def unescape(string):
    rx = re.compile(r'(\\x((?:[0-9a-fA-F]){2}))')
    while True:
        m = rx.search(string)
        if m is None: return string
        string = string.replace(m.group(1), chr(int(m.group(2), 16)))

Вы можете использовать его для предварительной обработки строк, извлеченных из файла (не забудьте импортировать модуль re):

v_conf_file = 'excl_char_seq.lst'   
with open(v_conf_file) as f:
     seqlist = [ unescape(line.strip()) for line in fd ]
line = 'weríº½66'
print ([ 1 for seqs in seqlist if seqs in line ])

Когда я контролировал содержимое seqlist, я получал, как и ожидалось:

>>> print seqlist
['\xed\xba\xbd', '\xed\xa9\x81', '\xed\xba\x91']
...