在LARGE字符串中查找子字符串

时间:2017-06-30 19:02:48

标签: python

#read in csv file in form ("case, num, val \n case1, 1, baz\n...")
# convert to form FOO = "casenumval..." roughly 6 million characters
for someString in List: #60,000 substrings
    if substr not in FOO:
        #do stuff
    else: 
        #do other stuff

所以我的问题是有太多的子字符串来检查这个庞大的字符串。我已经尝试逐行读取文件并检查该行的子字符串,但这仍然会导致程序崩溃。是否有任何技术可以有效地检查很多子串?

FOR CONTEXT: 我正在执行数据检查,可疑数据被保存到csv文件以进行检查/更改。然后将此已审核/更改的文件与原始文件进行比较。未更改的数据已经过验证,并且必须保存到新的“exceptionFile”中。已更改并通过的数据将被忽略。已更改并经过检查且仍然可疑的数据将被重新发送以供审核。

1 个答案:

答案 0 :(得分:2)

你应该做的第一件事是将你的60,000个字符串列表转换成一个大的正则表达式:

import re
searcher = re.compile("|".join(re.escape(s) for s in List)

现在您可以一次搜索

for m in searcher.finditer(FOO):
    print(m.group(0))  # prints the substring that matched

如果你关心的只是知道找到了哪些,

print(set(m.group(0) for m in searcher.finditer(FOO))

这仍然比绝对最低限度的工作要多得多,但它应该比以前更有效

此外,如果您知道您的输入是CSV文件,并且您也知道没有任何字符串搜索包含换行符,您可以逐行操作,这可能是也可能不是比你做的更快取决于条件,但肯定会使用更少的内存

with open("foo.csv") as FOO:
    for line in FOO:
        for m in searcher.finditer(line):
            # do something with the substring that matched