正则表达式和动态替换


正则表达式修饰符:

\w:数字,字母,下划线
\d:阿拉伯数字
\s:空白字符:换行,空格,制表符
[]: 一组字符
():分组字符
(|) :任一字符;管道字符|
()?:可选匹配
{}?:非贪心匹配
重复修饰符: (*, +, ?, {m,n}..)
{}:字符个数或范围
* :>=0次
+ :>=1次
. :通配符
.*:除换行的所有字符

正则表达式的动态替换:

python 中 re.sub方法不仅可以传入正则表达式,也可以传入函数,其中函数输入参数为 SRE_Matcher 案例如下:

另外,正则表达式选择分组的方法 $1 在 python 中写作 \g<1>,为了避免歧义,匹配小数点时建议使用 2 个反斜线 \\

import re
p = 's1.b2.bn.weight'
p = 's1.b2.proj.weight'
p = 's1.b1.f.a_bn.num_batches_tracked'
# p = 's1.b1.f.b.k4.1.running_var'
d = 'res2.1.shortcut.norm.weight'

# pattern = "^s(\d+)\\.b(\d+)\\.bn\\.(\w+)$"
# pattern = "^s(\d+)\\.b(\d+)\\.(bn|proj)\\.(\w+)$"
# pattern = "^s(\d+)\\.b(\d+)\\.(bn|proj|f\\.\w+|f\\.\w+\\..*)\\.(\w+)$"
pattern = "^s(\d+)\\.b(\d+)\\.(bn|proj|f\\..*)\\.(\w+)$"
new = "res\g<1>.\g<2>.shortcut.norm.\g<3>"

def f(matcher):
    gs = matcher.groups() # 可以得到每个组的元素 tuple
    string = matcher.expand(new) # 和 re.sub 等价的方法
    print('gs:',gs)
    return matcher.expand(new)


ret = re.sub(pattern, f, p)
print('returned:', ret)

# 输出为
# gs: ('1', '1', 'f.a_bn', 'num_batches_tracked')
# returned: res1.1.shortcut.norm.f.a_bn