我有以下问题 - 数据来自db(oracle),但我希望在python(使用正则表达式)中解决它。但是,我担心这个过程不会在合理的时间内完成,所以我可以使用一些建议。将数据从db中拉出到python列表中,我有以下内容: 关键字,5000个字符串的列表,每个字符串的长度<= 40 search_phrases,1/300万个字符串列表,每个字符串的长度在50到150之间 found_phrasess,30 000个字符串的列表,每个字符串的长度在20到50之间
我想在search_words中搜索表单的模式 pattern1 =数字关键字 pattern2 = number keyword1任何数字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中更快地完成它,或者建议留在db中(列表只是两个不同表中的不同列条目)并学习如何在那里进行正则表达式,请让我知道。感谢。
UPDATE1:
现在我只搜索pattern1(时间限制),并将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','gram','mg','milli gram','Milli-gram',...(以及所有变化你可以想到测量质量) 示例search_phrases:'
答案 0 :(得分:0)
您可以使用http://htql.net中的htql.RegEx。它可以很好地处理大型列表。以下是其网站上的示例:
import htql;
address = '88-21 64th st , Rego Park , New York 11374'
states=['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut',
'Delaware', 'District Of Columbia', 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana',
'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', 'Michigan',
'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire',
'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota', 'Ohio', 'Oklahoma',
'Oregon', 'PALAU', 'Pennsylvania', 'PUERTO RICO', 'Rhode Island', 'South Carolina', 'South Dakota',
'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington', 'West Virginia', 'Wisconsin',
'Wyoming'];
a=htql.RegEx();
a.setNameSet('states', states);
state_zip1=a.reSearchStr(address, "&[s:states][,\s]+\d{5}", case=False)[0];
# state_zip1 = 'New York 11374'