代码之家  ›  专栏  ›  技术社区  ›  Kaushik Nayak

从python中的文件中读取一个坏的utf数据列表,并将其与一行进行比较

  •  0
  • Kaushik Nayak  · 技术社区  · 7 年前

    我要这个字符序列

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

    我的 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 回复  |  直到 7 年前
        1
  •  1
  •   Serge Ballesta    7 年前

    问题是从文件中读取的行实际上包含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']