我有以下文字
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。 也许有一些逻辑可以加快您的正则表达式。 至少你可以找到你的瓶颈,也许正则表达式根本不是问题。