2024-06-07 00:27:26 发布
网友
我有一个字符串“s”如下
s="abc123abcfndfabc1234drfabc"
我想把出现在“abc”之间的字符串变灰。在这种情况下,输出应为:
123, fndf, 1234drf
除非这是一个您必须使用regex的赋值,否则您应该使用vikramls基于split()的解决方案:它的速度是Avinash Raj基于regex的解决方案的三倍多,这还不包括导入re模块的时间。你知道吗
split()
re
下面是使用Python2.6.6在2GHz Pentium4上完成的一些计时。你知道吗
$ 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/圈
上面的一个变体丢弃列表的初始成员和最终成员稍微慢一点,但仍然比regex快一倍。你知道吗
$ 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重新打开历史扩展)。你知道吗
"'!'"
!
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/圈
使用如下positive lookahead and lookbehind断言。你知道吗
>>> import re >>> s="abc123abcfndfabc1234drfabc" >>> re.findall(r'(?<=abc).*?(?=abc)', s) ['123', 'fndf', '1234drf']
DEMO
说明:
(?<=abc)
abc
.*?
(?=abc)
不使用正则表达式:
s= "abc123abcfndfabc1234drfabc" print ', '.join((w for w in s.split('abc') if w))
除非这是一个您必须使用regex的赋值,否则您应该使用vikramls基于
split()
的解决方案:它的速度是Avinash Raj基于regex的解决方案的三倍多,这还不包括导入re
模块的时间。你知道吗下面是使用Python2.6.6在2GHz Pentium4上完成的一些计时。你知道吗
$ 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/圈
上面的一个变体丢弃列表的初始成员和最终成员稍微慢一点,但仍然比regex快一倍。你知道吗
$ 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/圈
使用如下positive lookahead and lookbehind断言。你知道吗
DEMO
说明:
(?<=abc)
肯定的Lookbehind,断言匹配的字符串必须是abc
.*?
零个或多个chracater的非贪婪匹配。你知道吗(?=abc)
断言匹配后的字符串必须是abc
的正向前瞻不使用正则表达式:
输出:
相关问题 更多 >
编程相关推荐