Python 正则表达式同时删除多种匹配

这是输入:

%%timeit 10<=1147.7 ns ± 0.211 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)%%timeit 10<1148.5 ns ± 0.362 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

这是想要的输出:
10<=11 47.7 ns10<11 48.5 ns

这是表达式:
r=re.sub('(%%timeit\n)|\n\n(?=\d)|( ±.*\))','',s)

顺便提一下这个:
r=re.sub('(%%timeit\n)|(\n(?=\S))','',s) print('处理结果:\n%s'%r)

决不能是
r=re.sub('[%%timeit\n][\n(?=\S)]','',s) r=re.sub('[%%timeit\n]|[\n(?=\S)]','',s) r=re.sub('[(%%timeit\n)|(\n(?=\S))]','',s)

python - 啃书 第八章 正则表达式
原理,我开始写错过,以为两种匹配干扰了操作,之后发现是括号的原因,结论就是绝不能用方括号,全程圆括号,方括号是[A-Z]或[^A-Z]时用到的,是括住的内容任意一个元素的意思。
时间长了,忘了怎么写,于是绕了一大圈,改了好几次,算是写出来了!
删除(替换)的原理,将语句换长findall,去掉替换词,秒懂。
是先将符合规则的片段都先找出来,然后一并替换掉,因为替换是一次性操作,并没有规则相互干扰之说,但如果强行写个可能会相互干扰的规则组
例如加入跨越规则的规则:
(each[\n%)]*.*\n\d*)

import re s='%%timeit\n10<=11\n\n\n47.7 ns ± 0.211 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)\n\n%%timeit\n10<11\n\n\n48.5 ns ± 0.362 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)' r=re.sub('( ±.*\))|(each[\n%)]*.*\n\d*)','',s) print('处理结果:\n%s'%r)

【Python 正则表达式同时删除多种匹配】这段代码中,有第一个规则的存在,第二个规则是不生效的,无论二者顺序如何。
import re s='%%timeit\n10<=11\n\n\n47.7 ns 0.211 ns per loop (mean std. dev. of 7 runs, 10000000 loops each)\n\n%%timeit\n10<11\n\n\n48.5 ns ± 0.362 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)' r=re.sub('( ±.*\))|(each[\n%)]*.*\n\d*)','',s) print('处理结果:\n%s'%r)

如果去掉字符串中,第一段的两个±,一切瞬间明了。
因为规则1会把规则2的触发条件弄消失,所以规则2无法触发。那为什么不是规则2把规则1弄的无法触发呢,大概是这样的,re处理规则时,流程其实是字符串顺序,当规则1触发后,符合规则1的字符串就全部跳过(findall),所以就无法触发规则2。
import redef l(): '耗时在末尾行' s=input('输入要处理的字符串:\n') r=re.sub('(%%timeit\n)|\n\n(?=\d)|( ±.*\))','',s) print('处理结果:\n%s'%r)def s(): '耗时在末行后' s=input('输入要处理的字符串:\n') r=re.sub('(%%timeit\n)|( ±.*\n)|( ±.*)','',s) r=re.sub('\n\n\n',' # ',r) print('\n处理结果:\n%s'%r)def ss(): '按照耗时排序' s=input('输入要处理的字符串:\n') s1=re.sub('\n\n\n(?=.*±)|( ±.*\\n\n)','#-#',s) s2=re.sub('(%%timeit\n)|( ±.*\)$)','',s1) l=s2.split('#-#') d={} for i in range(1,len(l),2): if re.search('s|ns|μs|ms|min',l[i]): d[l[i-1]]=l[i] else: print('序列出错,未达到期望效果:l[%i] %s'%(i,l[i])) break ls=sorted(d.items(),key=lambda x:x[1]) print('\n按照耗时排序:') for i in ls: print(i[0]+' # '+i[1])

    推荐阅读