首页 > 解决方案 > 创建新规则和使用“|”之间的正则表达式运行时差异,python

问题描述

我正在使用python3.

我有一个规则:(re.compile(r'a b', re.IGNORECASE), "A")后来我发现'a c'也应该是匹配的。

哪种方式添加此规则更有效?

(re.compile(r'a (b|c)', re.IGNORECASE), "A")

或者只是添加另一个规则

(re.compile(r'a c', re.IGNORECASE), "A").

我做了'timeit',但没有显着差异。我想知道我的结论是否正确,其背后的原因以及它是否适用于多种情况,例如'a(b | c | d | e)'和三个额外规则。

标签: pythonregex

解决方案


由于正则表达式在线性时间(输入单词)中匹配,我相信拥有一个(更复杂)正则表达式应该比许多不同(更小)的正则表达式更有效。

快速而肮脏的测试:

import re 
import timeit

def create_simple_regex(lookup):
  return re.compile(lookup)

def create_complex_regex(lookups):
  return re.compile('|'.join(lookups))  

def look_with_simple(lookups, word):
  return [create_simple_regex(lookup).findall(word) for lookup in lookups]

def look_with_complex(lookups, word):
  return create_complex_regex(lookups).findall(word)

lookups = list('abcdefghijklmnopqrstuvwxyz')
word = 'hello world!' * 1000

print(timeit.timeit('look_with_simple(lookups, word)', number=1000, globals=globals()))

print(timeit.timeit('look_with_complex(lookups, word)', number=1000, globals=globals()))

这导致(在在线 REPL 中执行):

1.62659708800129
5.003811294998741

所以看来我错了;-)


推荐阅读