Python,加速正则表达式提取子字符串

时间:2017-08-10 11:02:53

标签: python regex

我有以下文字

text = "This is a string with C1234567 and CM123456, CM123, F1234567 and also M1234, M123456"

我想提取这个子串列表

['C1234567', 'CM123456', 'F1234567']

这就是我想出来的

new_string = re.compile(r'\b(C[M0-9]\d{6}|[FM]\d{7})\b')
new_string.findall(text)

但是,我想知道是否有办法更快地完成这项工作,因为我有兴趣执行此操作数万次。

我以为我可以使用^来匹配字符串的开头,但我提出的正则表达式

new_string = re.compile(r'\b(^C[M0-9]\d{6}|^[FM]\d{7})\b')

不再退货了。我知道这是一个非常基本的问题,但我不确定如何正确使用^

1 个答案:

答案 0 :(得分:2)

好消息和坏消息。坏消息,正则表达式看起来相当不错,难以改进。好消息,我有一些想法:)如果你正在寻找性能,我会尝试在盒子外做一点思考。我使用Python进行Extract Transform Load工作。

  • 你已经在做re.compile(大帮助)
  • 正则表达式引擎从左到右,所以你可以短路。似乎不适用于此
  • 如果您有大量数据需要多次循环,请事先清理一下你知道不会匹配的内容。想想一个HTML页面,你只需要HEAD中的东西来获取HEAD,并且需要在该部分上运行许多正则表达式的循环。提取该部分,仅执行该部分,而不是整个页面。看起来显而易见,并非总是如此:)
  • 使用一些指标,尝试cProfile。也许有一些逻辑可以解决你可以加速的问题。至少你可以找到你的瓶颈,也许正则表达式根本不是问题。