Python:寻找更有效的正则表达式

时间:2017-09-08 02:18:36

标签: python regex

我试图从10-k声明中提取每个公司的消费者数据。

我的具体目标句是

(例如)"消费者A,消费者B占销售额的~~~ ~~~~~。"

然而,这句话有很多变种

要考虑所有这些变体,需要考虑一些要点

1。 例如,帐户可以是帐户\帐户\会计\代表\代表\代表\代表(此外,如果代表出现,则目标句子中应该没有"对于#34;)

和销售可以是销售\收入\收入

  1. 因为,公司名称有时在该目标句子之前/之后出现1或2个句子。我想在同一时间之前/之后提取目标句子+ 2个句子。但是,一些公司名称包含"。",如"丰田公司,"和#34;美国国防部" 。因此,如果我尝试在这个目标句子之前提取2个句子("丰田公司,占销售额的~~~~~~~~"),基于"的数量。 "在目标句子之前,这只在目标句子之前提取一个句子。
  2. 所以,考虑到这两点我做了正则表达式,

    [.][^.]*[.][^.]*[.][^.]*[A-Z\.|\.\,]*[^.]*(account|accounted|accounts|accounting|represents|representing|represent|represented)(\sfor)?.{0,100}(sale|revenue)[^.]*\.?[^.]*\.',
    re.I|re.S
    

    但是,这个正则表达式运行得很慢......

    你能帮我理解如何改进这个正则表达式吗?

    非常感谢!

1 个答案:

答案 0 :(得分:0)

问题在于你的正则表达式在开始时过于笼统,而在结束时过于具体。正则表达式引擎可以将几乎所有与正则表达式的前几个符号相匹配,因此在获得匹配之前,它会尝试数千个字符串组合,这是由于更严格的结束条件。

注意:您没有给我任何示例文本,所以我尽了最大努力。

这个表达式要简单得多,但工作“足够好”。通过允许一些限制,运行时将得到很多改进。

(\s\S+){1,5}\s(account|represent)[\s\S]{5,100}?(sale|revenue)s?

Try it online!

例如,只要单词“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?