- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有以下问题 - 数据来自数据库(oracle),但我希望用 python(使用正则表达式)解决它。但是,我担心这个过程不会在合理的时间内完成,所以我可以使用一些建议。将数据从数据库中提取到 python 列表中,我有以下内容:关键字,一个包含 5000 个字符串的列表,每个字符串的长度 <=40search_phrases,1/3 百万个字符串的列表,每个字符串的长度在 50 到 150 之间found_phrasess,30 000 个字符串的列表,每个字符串的长度在 20 到 50 之间
我想通过 search_words 搜索形式的模式pattern1 = 数字关键字pattern2 = number keyword1 任意 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:
现在我只搜索 pattern1(时间限制),并将 for 循环的顺序切换为
for word in keywords:
for phrase in search_phrases:
found.extend(re.findall(p1+word, phrase))
使用此顺序,它在大约 90 秒内运行示例 search_phrase 列表(30 000 个元素)。
如果 if if grep -f keywords search_phrases,生成的文件只缩短了大约 5%(大多数 search_phrases 将匹配)。
示例关键字:“g”、“gr”、“G”、“gram”、“grams”、“mg”、“milli gram”、“Milli-gram”……可以想到测量质量)示例 search_phrases: '
最佳答案
您可以使用 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'
关于python - 正则表达式耗时太长(大数据集),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19145043/
在我们的服务出现一些预期的增长之后,突然间一些更新花费了非常长的时间,这些过去非常快,直到表达到大约 2MM 记录,现在它们每个需要大约 40-60 秒。 update table1 set fiel
我在服务中实现了一个传感器事件监听器,只要采样周期和最大报告延迟低于 1 秒,该监听器就可以正常工作,但一旦我将采样周期增加到超过 1 秒,传感器就根本不会更新。 我希望采样周期为 10 秒(可能是
我使用 Tkinter GUI 来启动测量和分析过程,基本上只需单击一个按钮即可开始。由于这些测量可能需要一段时间,我尝试添加一个进度条,即这个: http://tkinter.unpythonic.
我正在尝试使用套接字发送数据包,但出现错误。 invalid conversion from ‘omnetpp::cPacket*’ to ‘inet::Packet*’ [-fpermissive]
我刚刚发现 String#split 有以下奇怪的行为: "a\tb c\nd".split => ["a", "b", "c", "d"] "a\tb c\nd".split(' ') => ["a
您好,我正在尝试 ClojureScript,我正在使用 Klipse作为我的 REPL 差不多。这可能不是它的预期用途,但因为我没有做任何太复杂的事情,所以现在没问题。 我遇到的一个问题是尝试设置计
根据下面的数据,ClockKit 会生成一次 future 的 CLKComplicationTimelineEntry 项,但对于过去的时间点,会进行 24 次调用!这是为什么? 更多详情: 我注意
我有一个 MySQL 表,这个表有一个名为 datetime_utc 的 DATETIME 列。如您所料,它是 UTC 日期和时间。在我的 Bookshelf 模型中,我定义了一个虚拟 getter,
大家好,我是二哥呀! 昨天,一位球友问我能不能给他解释一下 @SpringBootApplication 注解是什么意思,还有 Spring Boot 的运行原理,于是我就带着他扒拉了一下这个注解的源
我是一名优秀的程序员,十分优秀!