2

我有以下问题 - 数据来自数据库(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:'

4

1 回答 1

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'
于 2013-10-31T15:50:51.497 回答