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

这是输入:

%%timeit
10<=11


47.7 ns ± 0.211 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%%timeit
10<11


48.5 ns ± 0.362 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

这是想要的输出:

10<=11
47.7 ns

10<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)

这段代码中,有第一个规则的存在,第二个规则是不生效的,无论二者顺序如何。

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 re

def 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])

你可能感兴趣的:(python)