如何编写正则表达式来替换类似哈希的字符串

时间:2018-01-26 17:31:57

标签: python regex windows path

有一些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中做到这一点?

提前致谢。

2 个答案:

答案 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

中修改该值