我有一个字符串“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
关于python - 如何使用 python 正则表达式在相同模式之间获取行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27098591/