我有以下问题 - 数据来自数据库(oracle),但我希望在 python 中解决它(使用正则表达式)。但是,我担心这个过程不会在合理的时间内完成,所以我可以提出一些建议。将数据从数据库中提取到 python 列表中,我有以下内容:关键字,5000 个字符串列表,每个长度 <=40 search_phrases,1/3 百万字符串列表,每个长度在 50 到 150 之间 found_phrasess,列表30 000 个字符串,每个长度在 20 到 50 之间
我想通过 search_words 搜索以下形式的模式 pattern1 = number keyword pattern2 = number keyword1 anything number keyword2
将这些模式收集到一个列表中,然后删除那些已经在 found_phrases 中的模式。
首先我在python中尝试了以下内容:
found = []
p1 = r'[0-9.]+[/\s-]*'
pattern1 = re.compile(r'|'.join([p1 + word for word in keywords])
for phrase in search_phrases:
found.extend(re.findall(pattern1, phrase))
return set(found).difference(found_phrases)
由于正则表达式中的 OverflowError,这不起作用。所以我做了一个双for循环:
for phrase in search_phrases:
for word in keywords:
found.extend(re.findall(p1 + word, phrase))
但这需要的时间太长(即,还没有完成)。
如果您对此有任何建议,无论是如何在 python 中更快地完成它,或者建议留在数据库中(列表只是来自两个不同表的不同列条目)并学习如何在那里执行正则表达式,请告诉我. 谢谢。
更新1:
现在我只搜索模式 1(时间限制),并将 for 循环的顺序切换为
for word in keywords:
for phrase in search_phrases:
found.extend(re.findall(p1+word, phrase))
使用此顺序,它会在大约 90 秒内在示例 search_phrase 列表(30 000 个元素)上运行。
如果如果使用 grep -f 关键字 search_phrases,则生成的文件仅短约 5%(大多数 search_phrases 将匹配)。
示例关键字:'g', 'gr', 'G', 'gram', 'grams', 'mg', 'milli gram', 'Milli-gram' , ...(加上你能想到的所有变体用于测量质量)示例 search_phrases:'