写一个文件读取修改的脚本,遇到字符串查找匹配和修改的问题。匹配过程中,多次都匹配不上,这里记录下解决过程。
从文件中读取到一个如下字符串:
想分别获取:
./test\rknn_transform_tiny.py
19
rknn.load_darknet(model='./cfgs/cfg.cfg',weight="./models/model.weights")
匹配方法一 :
后来觉得[]
符号不好匹配,后来把字符串改成如下格式再进行匹配:
代码如下:
search_result='./test\rknn_transform_tiny.py19: rknn.load_darknet(model=\'./cfgs/cfg.cfg\',weight="./models/model.weights")'
nameRegex = re.compile(r'(.*).py(.*):(.*)',re.DOTALL)
mo=nameRegex.search(search_result)
print(mo2.group(1))
print(mo2.group(2))
print(mo2.group(3))
输出结果如下:
匹配方法二 :
现在知道怎么匹配[]
符号:[]
符号需要转义
代码如下:
search_result='[./test\rknn_transform_tiny.py][19]: rknn.load_darknet(model=\'./cfgs/cfg.cfg\',weight="./models/model.weights")'
nameRegex = re.compile(r'\[(.*)\]\[(.*)\]:(.*)',re.DOTALL)
mo=nameRegex.search(search_result)
print(mo2.group(1))
print(mo2.group(2))
print(mo2.group(3))
输出结果如下:
正则表达式匹配字符串——问题总结
就上面这个字符串来说,匹配时要注意的几点如下:
① python中[]
符号是特殊符号,[]
放在字符串中需要转义。
一开始写的是:
nameRegex = re.compile(r'[(.*)][(.*)]:(.*)')
匹配的结果始终是None
修改成如下后可以匹配到了:
nameRegex = re.compile(r'\[(.*)\]\[(.*)\]:(.*)')
②这个字符串中包含了空格和换行符,想要将换行符也匹配到的话,需要为re.compile()
传入re.DOTALL
作为第二个参数
这是因为【 .*
】匹配的是除换行符外的所有字符
nameRegex = re.compile(r'\[(.*)\]\[(.*)\]:(.*)',re.DOTALL)