我有一个2GB的.txt文件,其中有超过6000万行应该是MD5哈希值。由于“算术错误”,我一直在将其导入某个软件时遇到问题。之前,我删除了任何不包含32个字符的行(表示MD5哈希长度)。尽管如此,这个问题仍然存在。
手动查看文档后,某些行确实不包含有效的哈希值。因此,我希望阅读每一行,如果它包含的值不是0-9和A-F之间的值,我会删除该行。
我预计Regex可能是必需的,但不确定。
我刚刚提到了如何实现此字符串验证的一些指示?如上所述,每行只应包含0-9和A-F(十六烷基)之间的字符。
提前致谢
答案 0 :(得分: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
会擦除文件!)
答案 1 :(得分:3)
可能的正则表达式,当然也可能与其他东西相匹配。但是,它仅检查字符A-F和数字0-9。
r'^[A-F\d]+$'
您可以轻松添加{32}
以检查长度,但是您说您已经清除了任何非32长度的线,这没关系(对于新的正则表达式的人来说,只是模糊不清不必要的事情)。作为参考,它将如下所示:
r'^[A-F\d]{32}+$'
您只需逐行读取文件,并在正则表达式上进行匹配。如果是匹配项,请将其添加到输出文件中。
有关Python re模块的更多信息,请查看http://docs.python.org/library/re.html
答案 2 :(得分: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
答案 3 :(得分:0)
您可以使用re来解析该行。
试试这段代码:
import re
match = re.match('[0-9A-F]{32}', line)
if match:
#valid line
else:
#invalid line
答案 4 :(得分: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
答案 5 :(得分:0)
grep '[A-Fa-f\d]{32}' filename.txt >newfilename.txt if you have access to terminal.