如何使用python regex获得同一模式之间的行

2024-06-07 00:27:26 发布

您现在位置:Python中文网/ 问答频道 /正文

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

s="abc123abcfndfabc1234drfabc"

我想把出现在“abc”之间的字符串变灰。在这种情况下,输出应为:

123, fndf, 1234drf


Tags: 字符串情况abc变灰abc123abcfndfabc1234drfabcfndf
3条回答

除非这是一个您必须使用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断言。你知道吗

>>> import re
>>> s="abc123abcfndfabc1234drfabc"
>>> re.findall(r'(?<=abc).*?(?=abc)', s)
['123', 'fndf', '1234drf']

DEMO

说明:

  • (?<=abc)肯定的Lookbehind,断言匹配的字符串必须是abc
  • .*?零个或多个chracater的非贪婪匹配。你知道吗
  • (?=abc)断言匹配后的字符串必须是abc的正向前瞻

不使用正则表达式:

s= "abc123abcfndfabc1234drfabc"
print ', '.join((w for w in s.split('abc') if w))

输出:

123, fndf, 1234drf

相关问题 更多 >