2

我有一个 2GB 的 .txt 文件,其中包含超过 6000 万行的 MD5 哈希值。由于“算术错误”,我一直在将其导入软件时遇到问题,因此在此之前,我删除了任何不包含 32 个字符的行(以表示 MD5 哈希长度)。尽管如此,问题仍然存在。

手动查看文档后,有些行确实不包含有效的哈希值。因此,我希望阅读每一行,如果它包含的值不是 0-9 和 AF 之间的值,我希望删除该行。

我预计可能需要正则表达式,但不确定。

我只是在获得有关如何实现此字符串验证的一些指示?如前所述,每行应仅包含 0-9 和 AF(十六进制)之间的字符。

提前致谢

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 回答
3

一个可能的正则表达式是,它当然也可能匹配其他事物。但是,它只检查字符 AF 和数字 0-9。

r'^[A-F\d]+$'

您可以轻松添加{32}以检查长度,但您说您已经清除了任何非 32 长度的行,这没关系(对于正则表达式的新手来说,只会不必要地模糊事物)。作为参考,它看起来像这样:

r'^[A-F\d]{32}+$'

您只需逐行读取文件并匹配正则表达式。如果匹配,则将其添加到输出文件中。

有关 Python re 模块的更多信息,请查看http://docs.python.org/library/re.html

于 2012-10-23T12:58:57.823 回答
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

不使用正则表达式的另一种可能的解决方案

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 回答
0
grep '[A-Fa-f\d]{32}' filename.txt >newfilename.txt if you have access to terminal.
于 2012-10-23T13:45:13.890 回答