从二进制文件中提取文本(在Windows 7上使用Python 2.7)

从二进制文件中提取文本(在Windows 7上使用Python 2.7),python,perl,text-extraction,Python,Perl,Text Extraction,我有一个大约5MB大小的二进制文件。。其中有很多穿插的文字。。和控制字符 这实际上相当于SITATEX应用程序的outlook.pst文件(来自SITA) 该文件包含从外部世界发送和接收的所有文本消息…(但文本必须通过二进制控制字符提取)。。所有的短信都清晰可见。。。以^M个字符结尾的行。。。等等 例如:假设^X是控制字符\xaa和HEX aa等。围绕我所需的文本提取加载它们 ^@^@^@^@^@^@^@^@^@^@^@BLLBBCC^X^X^X^X^X^X^X^X^X ^X^X^X MVT^M

我有一个大约5MB大小的二进制文件。。其中有很多穿插的文字。。和控制字符

这实际上相当于SITATEX应用程序的outlook.pst文件(来自SITA)

该文件包含从外部世界发送和接收的所有文本消息…(但文本必须通过二进制控制字符提取)。。所有的短信都清晰可见。。。以^M个字符结尾的行。。。等等

例如:假设^X是控制字符\xaa和HEX aa等。围绕我所需的文本提取加载它们

^@^@^@^@^@^@^@^@^@^@^@BLLBBCC^X^X^X^X^X^X^X^X^X
^X^X^X
MVT^M
EA1123 TEXT TEXT TEXT^M
END^M
\xaa^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
 ^@^@^@^@^@^@^@^@^@^@^@TTBBTT^X^X^X^X^X^X^X^X^X
   ^X^X^X blah blah blah... of control characters.. and then the message comes..
   MVT MESSAGE 2
   ED1123
   etc.
等等。。有好几条消息

使用Perl。。这很容易做到:

while (<>) {
  use regular expression to split messages
  m/   /


}
到目前为止还不错。。我仍然没有完全做完。。因为我需要逐行逐字地解析文本。。要拾取(作为示例)源地址和标题、主题行、消息正文。。。通过控制字符解析消息

现在我被困在。。。如何使用转换为
\x00\x02..
等的控制字符逐行打印(使用
\xHH
格式)。。但不要使用普通的可读文本

例如。。假设我有:假设
^@
^X
是一些控制字符
line1='^@UG^^^^^^^^^^^^^ BLLBBCC^X^X^X^X^X^X^X^X^X'
(在第一行)

当我打印处于空闲状态的行时<代码>打印行1。。它只打印前2或3个字符。。并忽略其余部分,因为控制字符被阻塞

但是,当我打印时:
print re.findall(r'.*',第1行)

它可以很好地打印,所有控制字符都转换为\xHH格式。。和ascii文本保持不变。。(正如我所希望的)…只抓一个。。这个列表有两项。。以“”结尾

  • 最后空字符串的解释是什么
  • 如何避免它。。。我只想把行很好地转换成字符串(而不是列表)。i、 e.将一行二进制/文本转换为带有\xHH代码的字符串。。不要使用ASCII文本
  • 正在使用
    re.findall(r'.*',第1行)
    是唯一简单的解决方案。。要进行此转换。。或者有没有其他直接的方法。。将
    '\x00string'
    转换为\xHH和文本(其中它是可打印字符或空白)

    还有。。任何其他有用的注释都可以很好地表达出来

    谢谢

    更新2011年1月2日-第2部分

    我发现
    re.findall(r'.+',第1行)
    strips to

    ['\xaaUG\x02\x05\x00\x04\x00\x00\x00\x05\x00\x00\x00....
        x00\x00\x00..BLLBBCC\x00\x00N\x00N\\x00
         002 010 180000 DEC 11']
    
    列表中没有额外的空白“”项。这一发现是经过多次尝试和错误后得出的

    尽管如此,我仍然需要帮助来完全删除列表,但只返回一个字符串。 像这样:

    '\xaaUG\x02\x05\x00\x04..BLLBBCC..002 010 180000 DEC 11'
    
    增加了1月5日的信息:

    @约翰·梅金

    1) \xaaU是消息之间的分隔符。。在这个例子中。。我可能在样品中遗漏了。请参见下面的一条以\xaaU结尾的实际消息(但被忽略)。 以下文本来自repr(msg between
    r'\xaaU.*(?=\xaaU)

    我正在努力理解二进制格式。。这是发出的典型信息 第一个“JJJOWXH”是发件人地址。。任何后面有7个字母数字的都是接收方地址。。基于发件人地址。。我可以知道这是“SND”还是“RCV”。。由于源代码是“JJJOWXH”。。。这个味精是“SND”,因为我们是“JJJOWXH”

    该消息的地址是:JJKLXH。。。。JJKRXH。。。。等等

    只要所有的\x00000000完成。。 sita标题和主题开始 在这种特殊情况下<代码>“\x00QN\x00HX\x00180001\x00”这是标题。。我只对\x00之间的所有内容感兴趣

    接下来是尸体。。在最后\x00或任何其他控制字符之后。。。在这种情况下。。。它是:

    COR\r\nMVT\r\nHX9136/17.BLNZ.JJJ\r\nA2309/2314 EA0128 BBB\r\nDRA/CI/0032/0022\r\nSI EET 02:14\r\n由于 迟交的ARVL ACFT\r\n CI/0022卸载悬垂托盘由于不足 打包导致\r\n空间问题

    一旦可读文本结束。。。将忽略在结束\xaaU之前出现的第一个控制字符。。。在上述情况下。。“空间问题”。。这是最后一个。。然后控制字符开始。。。所以被忽略。。。有时控制字符直到下一个\xaaU才出现

    这是一条完整的信息

    "\X0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00:\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\\x00\0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\\\\\X0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\\\\\\\\\\\\\\\\\\\\\\0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\00\\\\\\\\\\\\\\\\\\x00\x00\x00\x00\x00\x00\x00\x00\x00\00\00\\\\\\00\\\\\00\\\\\\\\\\x00\xff\x8f\x01\x90\x01\x00\x01jjfcxh\x00\xff\x97\x01\x98\x01\x00\x01jjfash\x00\x00\x9f\x01\x10\x01\x01\x01\x01\x01\x00\x00\x01\x01\x01\x01\x00\x00\x00\x01\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x01\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\\\x01\xd8\x01\x00\x01BBBFRUO\x00\x00\xdf\x01\xe0\x01\x00\x01BBBKKHX\x00\x00\xe7\x01\xe8\x01\x00\x01JJJLOTG\x00\x01\xef\x01\xf0\x01\x00\x01JJJLCTG\x00\x00\x00\xf7\x
    ['\xaaUG\x02\x05\x00\x04\x00\x00\x00\x05\x00\x00\x00....
        x00\x00\x00..BLLBBCC\x00\x00N\x00N\\x00
         002 010 180000 DEC 11']
    
    '\xaaUG\x02\x05\x00\x04..BLLBBCC..002 010 180000 DEC 11'
    
    fh = open('/path/to/my/file.ext', 'r')
    fh.read()
    
    fh = open('/path/to/my/file.ext', 'rb')
    
    import re
    
    mytext = '\xaaUseful text that I want to keep\xaa^X^X^X\xaaOther text i like\xaa'
    usefultext = re.findall('\xaa([a-zA-Z^!-~0-9 ]+)\xaa', mytext)
    
    print usefultext
    
    fh = open('/some/file.ext','r')
    
    for lines in fh.readlines():
        #do stuff
    
    import re
    with open('yourfile.pst') as f:
        contents = f.read()
    textstrings = re.findall(r'[\x20-\x7E]+', contents)
    
    >>> re.findall(r'.+', 'abc\r\ndef\r\n\r\n')
    ['abc\r', 'def\r', '\r']