【问题标题】:Combine in an efficient way regex python以有效的方式组合正则表达式 python
【发布时间】:2023-04-09 11:02:01
【问题描述】:

设置

我动态创建一个正则表达式列表,即regex_list。 列表中的每个正则表达式都肯定至少与应用的文本匹配。 列表中的某些正则表达式可能会相等。

regex_list = []
for f in foo: # foo is a list of strings e.g. foo = ['foo1', 'foo2', 'foo1', ...]
    # f is a valid expression to be used inside the regex
    regex_list.append(f'[^.]*?{f}[^.]*\.')

regex = re.compile('|'.join(regex_list), flags=re.DOTALL)
result = re.findall(regex, text)

问题

自从

  1. regex_list 中的某些正则表达式可能等于
  2. regex_list 中的正则表达式与 OR 运算符组合在一起

对于列表中存在另一个副本的正则表达式,仅捕获文本中的第一个匹配项。

问题

一种解决方法是使用 for 循环单独应用每个正则表达式,但它非常慢。

有没有一种结合正则表达式并使它们尽可能匹配的好方法?

【问题讨论】:

  • foo 里面有什么?几个例子就可以了。但是,您似乎只有需要在文本上一一执行的独立正则表达式。
  • foo 是一个字符串列表。例如foo = ['foo1', 'foo2', 'foo1', ...]
  • 喜欢['John', 'John Doe', 'John Doe Junior']?
  • 是的,我添加了一个示例
  • 好的,您将可以使用this approach。也许,使用overlapping regex,您可以更接近。但是,[^.]*?{f}[^.]*\. 模式意味着[^.] 可能会吃掉任何其他潜在的匹配项。恐怕你需要对匹配进行后期处理。

标签: python regex optimization re findall


【解决方案1】:

偶然发现使用re module在for循环中单独应用每个正则表达式非常慢,而使用regex module却快得惊人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多