我试图从10-k声明中提取每个公司的消费者数据。
我的具体目标句是
(例如)"消费者A,消费者B占销售额的~~~ ~~~~~。"
然而,这句话有很多变种
要考虑所有这些变体,需要考虑一些要点
1。 例如,帐户可以是帐户\帐户\会计\代表\代表\代表\代表(此外,如果代表出现,则目标句子中应该没有"对于#34;)
和销售可以是销售\收入\收入
所以,考虑到这两点我做了正则表达式,
[.][^.]*[.][^.]*[.][^.]*[A-Z\.|\.\,]*[^.]*(account|accounted|accounts|accounting|represents|representing|represent|represented)(\sfor)?.{0,100}(sale|revenue)[^.]*\.?[^.]*\.',
re.I|re.S
但是,这个正则表达式运行得很慢......
你能帮我理解如何改进这个正则表达式吗?
非常感谢!
答案 0 :(得分:0)
问题在于你的正则表达式在开始时过于笼统,而在结束时过于具体。正则表达式引擎可以将几乎所有与正则表达式的前几个符号相匹配,因此在获得匹配之前,它会尝试数千个字符串组合,这是由于更严格的结束条件。
注意:您没有给我任何示例文本,所以我尽了最大努力。
这个表达式要简单得多,但工作“足够好”。通过允许一些限制,运行时将得到很多改进。
(\s\S+){1,5}\s(account|represent)[\s\S]{5,100}?(sale|revenue)s?
例如,只要单词“account”或“represent”存在,它就不关心后缀是什么。如果有人输入“representenedsing”,那么它会选择它,但我们可以假设这样的事情不会发生。
此外,这个正则表达式并不试图找到之前的句子或任何复杂的句子。它只需要在“account”或“represent”之前的5个单词,并使用它们。当然,您可以轻松更改此值。
说明:
这包含5个包含任何字符的单词,由任意空格/换行符分隔。
(\s\S+){1,5}\s
“帐户”一词或代表“。
(account|represent)
至少5个,但最多100个任何类型的字符。 ?
使其成为“LAZY”,因此一旦达到下一个条件(“销售”或“收入”),它就会停止。
[\s\S]{5,100}?
“销售”或“收入”一词,最后带有可选的“s”。
(sale|revenue)s?