我有以下文字
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')
不再返回任何内容。我知道这是一个非常基本的问题,但我不确定如何正确使用 ^
。
最佳答案
好消息和坏消息。坏消息是,正则表达式看起来相当不错,但很难改进。好消息,我有一些想法:)如果您正在寻找性能,我会尝试做一些跳出框框的思考。我使用 Python 进行提取、转换、加载工作。
- 您已经在进行重新编译(有很大帮助)
- 正则表达式引擎是从左到右的,所以尽可能短路。似乎不适用于此处
- 如果您有大量数据需要多次循环,请先清除其中您知道不匹配的数据。考虑一个 HTML 页面,您只需要 HEAD 中的内容来获取 HEAD,并且需要在该部分上运行许多正则表达式的循环。提取该部分,只做该部分,而不是整个页面。看起来很明显,但并不总是:)
- 使用一些指标,尝试一下 cProfile。也许您正在调整的地方有一些逻辑可以加快速度。至少你可以找到你的瓶颈,也许正则表达式根本不是问题。
关于Python,加速正则表达式提取子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45611926/