背景
最后没能逃掉大创划水的结局,现在正在做的工作是把学到的方法写一个界面整合出来。
在界面显示哪些文件是相似度比较高的时候,需要根据前面的查重结果,找到一组一组的重复率高的文件。而之前的查重源码输出的格式是类似这样的:
.\test\1031170418_1_test1.s consists for 91 % of .\test\1032170222_1_work1.s material
.\test\1030415401_1_2333.s consists for 58 % of .\test\1030415629_1_LR.s material```
想要把重复率高的文件组成组,当然去源码里改是可以的,不过因为查重源码毕竟还是用的SIM,改他的输出格式比较麻烦,这里我就干脆根据他的输出文件,正则匹配出两两配对的文件,接下来建图求连通块就行了。
那么问题来了,面对这样的格式,正则匹配式要怎么写?
奥义:双重转义
就光是这里的正则匹配卡了我很久,这大概就是理论到时间的距离把——即使网课有讲过正则匹配,当时仍然没有想清楚匹配模式中的一个细节。通常,匹配模式中使用的字符串都会是原串,也就是r’字符串’的形式,而我之前的匹配式并没有用原串。当我考虑到了反斜杠需要写两次来进行匹配的时候,我对反斜杠的匹配是这样的:
re.complie('\\+')
没有结果。然后我就进行了花式尝试,加小括号加中括号。后来想到了待匹配串中应该是有两个slash,那么这里是不是应该用四个?用了四个果然对了,但是思路却并没有对。
真正的原因是,Python的字符串本身是会经历一次转义的,’\‘其实只是一个slash。而在re.compile的时候,字符串又会进行转义,所以,这里的’\+'经过两次转义之后,就变成了+,对,这个模式匹配的只是一个加号而已。
那么总结起来也非常简单,就是以后进行正则模式匹配的时候,都使用r’字符串’这样的原始字串,这样就只需要考虑一重转义就可以了。