0

データを抽出する正規表現を含むバイナリ ファイルを調べていますが、追跡できない正規表現に問題があります。

これは私が問題を抱えているコードです:

        z = 0
        for char in string:
            self.response.out.write('|%s' % char.encode('hex'))
            z+=1
            if z > 20:
                self.response.out.write('<br>')
                break

        title = []
        string = re.sub('^\x72.([^\x7A]+)', lambda match: append_match(match, title), string, 1)
        print_info('Title', title)

def append_match(match, collection, replace = ''):
    collection.append(match.group(1))
    return replace

これを実行したときの文字列の最初の 20 文字の内容は次のとおりです。

|72|0a|50|79|72|65|20|54|72|6f|6c|6c|7a|19|54|72|6f|6c|6c|62|6c

^ を削除した場合を除き、何も返されません。この場合、54726F6C6C である "Troll" (引用符ではない) が返されます。私が読んだように、\ x7aまでのすべてを返す必要があります。

何が起きてる?

4

1 に答える 1

2

問題は、\x0Aデフォルトでは (=newline) がドットに一致しないことです。パターンにdotall フラグを追加してみてください。次に例を示します。

re.sub('(?s)^\x72.([^\x7A]+)....
于 2013-03-21T18:32:12.800 に答える