Skip to main content
 首页 » 编程设计

python之如何使用 python 正则表达式在相同模式之间获取行

2025年05月04日24jyk

我有一个字符串“s”如下

s="abc123abcfndfabc1234drfabc"

我想 grep 出现在“abc”之间的字符串。在这种情况下,输出应该是:

123, fndf, 1234drf

请您参考如下方法:

除非这是您必须使用正则表达式的作业,否则您应该使用 vikramls 的 split()基于 -based 的解决方案:它的速度是 Avinash Raj 基于正则表达式的解决方案的三倍多,这还不包括导入 re 的时间。模块。

以下是使用 Python 2.6.6 在 2GHz Pentium 4 上完成的一些计时。

$ timeit.py -n 100000 -s "import re;p=re.compile(r'(?<=abc).*?(?=abc)');s='abc123abcfndfabc1234drfabc'" "p.findall(s)"

100000 次循环,最好的 3 次:每次循环 6.32 usec

$ timeit.py -n 100000 -s "p='abc';s='abc123abcfndfabc1234drfabc'" "s.split(p)"

100000 次循环,最好的 3 次:每次循环 2.03 usec

上面的变体丢弃了列表的初始和最终成员,速度稍慢,但仍然比正则表达式快两倍。

$ timeit.py -n 100000 -s "p='abc';s='abc123abcfndfabc1234drfabc'" "s.split(p)[1:-1]"

100000 次循环,最好的 3 次:每次循环 2.49 usec

为了完整起见,这里是 vks 的正则表达式。 "'!'"东西是为了防止!从调用 bash 历史扩展。 (或者,您可以使用 set +o histexpand 关闭历史扩展并使用 set -o histexpand 将其重新打开)。

$ timeit.py -n 100000 -s "import re;p=re.compile(r'(?<=abc)((?:(?"'!'"abc).)+)abc');s='abc123abcfndfabc1234drfabc'" "p.findall(s)"

100000 次循环,最好的 3 次:每次循环 6.67 usec