有一些Windows名称和文件夹包含如下名称:
C:\ WINDOWS \ serviceprofiles \本地服务\应用程序数据\ locallow \微软\ cryptneturlcache \元数据\ 57c8edb95df3f0ad4ee2dc2b8cfd4157 C:\ WINDOWS \ system32 \设置\ systemprofile \应用程序数据\ locallow \微软\ cryptneturlcache \元数据\ be7ffd2fd84d3b32fd43dc8f575a9f28 C:\ WINDOWS \ softwaredistribution \下载\ ab1b092b40dee3ba964e8305ecc7d0d9
注意它们如何以一个看起来像哈希的字符串结束:
57c8edb95df3f0ad4ee2dc2b8cfd4157,be7ffd2fd84d3b32fd43dc8f575a9f28, ab1b092b40dee3ba964e8305ecc7d0d9
我对正则表达式并不擅长,我想知道是否有办法编写一个正则表达式,用类似
的方式替换路径中的这些类似哈希的名称“## HASH ##”
路径不一定以这些为结尾,因为这些路径通常是包含自己的其他文件夹的文件夹/子文件夹。 所以我的目标是基本上找到一条路径:
C:\ WINDOWS \ serviceprofiles \本地服务\应用程序数据\ locallow \微软\ cryptneturlcache \元数据\ 57c8edb95df3f0ad4ee2dc2b8cfd4157 \ some_subfolder \ some_file.inf
成为:
C:\ WINDOWS \ serviceprofiles \本地服务\应用程序数据\ locallow \微软\ cryptneturlcache \元数据## HASH ## \ some_subfolder \ some_file.inf
有没有办法在Python中做到这一点?
提前致谢。
答案 0 :(得分:2)
如果你注意到,那么"哈希"是32个字符。 (如果这对所有人来说都是正确的)那么正则表达式非常简单。
例如,您发布的最后一个字符串
import re
text = 'c:\windows\serviceprofiles\localservice\appdata\locallow\microsoft\cryptneturlcache\metadata\\57c8edb95df3f0ad4ee2dc2b8cfd4157\some_subfolder\some_file.inf'
res = re.sub('\w{32}', '##HASH##', text)
print(res)
打印:
c:\windows\serviceprofiles\localserviceppdata\locallow\microsoft\cryptneturlcache\metadata\##HASH##\some_subfolder\some_file.inf
请注意我是如何通过\\5
转义\来告诉python它是文字\5
。
\w{32}
正则表达式意味着"匹配任何单词字符正好32次"
答案 1 :(得分:1)
这可能会有所帮助:
import os
import re
uuid = re.compile('[0-9a-f]{30}\Z', re.I)
A = "c:\windows\serviceprofiles\localservice\appdata\locallow\microsoft\cryptneturlcache\metadata\57c8edb95df3f0ad4ee2dc2b8cfd4157\sub_folder"
path = os.path.normpath(A)
path = path.split(os.sep)
path = "\\".join(["##"+i+"##" if uuid.match(i) else i for i in path])
print path
<强>结果:强>
c:\windows\serviceprofiles\localserviceppdata\locallow\microsoft\cryptneturlcache\metadata\##c8edb95df3f0ad4ee2dc2b8cfd4157##\sub_folder
注意:我正在编译30个字符长度。您可以在re.compile
中修改该值