2

MD5ハッシュ値であるはずの6000万行を超える2GBの.txtファイルがあります。「算術エラー」が原因でソフトウェアへのインポートに問題がありました。そのため、以前は、32文字を含まない行を削除しました(MD5ハッシュ長を表すため)。それにもかかわらず、問題は解決していません。

ドキュメントを手動で確認したため、一部の行には実際に有効なハッシュ値が含まれていません。したがって、すべての行を読みたいと思っています。0〜9からAFまでの値以外の値が含まれている場合は、その行を削除してください。

正規表現が必要になる可能性があると思いますが、よくわかりません。

この文字列検証を実装する方法についてのいくつかのポインタの直後ですか?前述のように、各行には0〜9からAF(16進数)までの文字のみを含める必要があります。

前もって感謝します

4

6 に答える 6

4
import re
import sys
import fileinput


md5_checker = re.compile("^[a-fA-F0-9]{32}$")

for line in fileinput.input():
    if md5_checker.match(line):
        sys.stdout.write(line)
    else:
        sys.stderr.write("INVALID: %s" % line)

使用法:

$ cat testfile.txt 
0cc175b9c0f1b6a831c399e269772661
92eb5ffee6ae2fec3ad71c777531578f
asdf
0cc175b9c0f1b6a831c399e269772661
92eb5ffee6ae2fec3ad71c777531578f

$ python ~/Desktop/md5_checker.py testfile.txt > cleaned.txt
INVALID: asdf

$ cat cleaned.txt 
0cc175b9c0f1b6a831c399e269772661
92eb5ffee6ae2fec3ad71c777531578f
0cc175b9c0f1b6a831c399e269772661
92eb5ffee6ae2fec3ad71c777531578f

警告: 同じファイルを読み書きしないでください (ファイルが消去されmd5_checker testfile.txt > testfile.txtます!)

于 2012-10-23T13:08:57.093 に答える
1

re.match適切な正規表現で使用してください。

import re

r = re.compile(r'^[a-fA-F0-9]{32}$')

with open("hashes") as i, open("hashes_cleaned", "w") as o:
    for line in i:
        # Cheap check for 32 chars, first.
        if len(line.strip()) == 32 and r.match(line.strip()):
            o.write(line)

入力:

% cat hashes
c2cf0d7b2d3c5cd91a1314a2285ce53e
12524f7af3a5dad467264683d0ec6206
746518a1c63294d367c23cab37f4166c
foo
4d6deee14efe78180c698679e16f7342
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
eb9a25b6b525ae665115b43a259d2355

出力:

% cat hashes_cleaned 
c2cf0d7b2d3c5cd91a1314a2285ce53e
12524f7af3a5dad467264683d0ec6206
746518a1c63294d367c23cab37f4166c
4d6deee14efe78180c698679e16f7342
eb9a25b6b525ae665115b43a259d2355
于 2012-10-23T13:02:14.013 に答える
0

reを使用して行を解析できます。
このコードを試してください:

import re
match = re.match('[0-9A-F]{32}', line)
if match:
    #valid line
else:
    #invalid line
于 2012-10-23T13:02:38.227 に答える
0
grep '[A-Fa-f\d]{32}' filename.txt >newfilename.txt if you have access to terminal.
于 2012-10-23T13:45:13.890 に答える
0

正規表現を使用しない別の解決策

import string
#create a set of all possible hex digits.
#in case you want only upper case hex letters, 
#convert to upper
hexchars = set(string.hexdigits.upper())
#iterate through your file
for line in somefile:
    #See if there is any chars apart from the hex char set
    if set(line) - set(hexchars):
        print "Some Invalid Message"
    else:
        #Do something useful
于 2012-10-23T13:20:24.353 に答える