【问题标题】:How can I write a regular expression to replace hash-like strings如何编写正则表达式来替换类似哈希的字符串
【发布时间】:2018-01-27 01:57:48
【问题描述】:

有些窗口名称和文件夹包含如下名称:

c:\windows\serviceprofiles\localservice\appdata\locallow\microsoft\cryptneturlcache\metadata\57c8edb95df3f0ad4ee2dc2b8cfd4157 c:\windows\system32\config\systemprofile\appdata\locallow\microsoft\cryptneturlcache\metadata\be7ffd2fd84d3b32fd43dc8f575a9f28 c:\windows\softwaredistribution\download\ab1b092b40dee3ba964e8305ecc7d0d9

注意它们是如何以看起来像哈希的字符串结尾的:

57c8edb95df3f0ad4ee2dc2b8cfd4157, be7ffd2fd84d3b32fd43dc8f575a9f28, ab1b092b40dee3ba964e8305ecc7d0d9

我不擅长正则表达式,我想知道是否有一种方法可以编写一个正则表达式,将路径中的这些类似哈希的名称替换为类似

的内容

"##HASH##"

路径不一定以这些结尾,因为这些通常是包含其他文件夹的文件夹/子文件夹。 所以我的目标是基本上得到一条看起来像这样的路径:

c:\windows\serviceprofiles\localservice\appdata\locallow\microsoft\cryptneturlcache\metadata\57c8edb95df3f0ad4ee2dc2b8cfd4157\some_subfolder\some_file.inf

变成:

c:\windows\serviceprofiles\localservice\appdata\locallow\microsoft\cryptneturlcache\metadata##HASH##\some_subfolder\some_file.inf

有没有办法在 Python 中做到这一点?

提前致谢。

【问题讨论】:

标签: python regex windows path


【解决方案1】:

如果您注意到,“哈希”是 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 次”

【讨论】:

  • \w 类包含许多从未在哈希值中找到的字符。
  • 哦,这很简单。现在我觉得有点傻。谢谢!
  • 您好,我现在注意到它还匹配以下路径:c:\windows\system32\tasks\microsoft\windows\shell\windowsparentalcontrolsmigration 并将它们转换为:c:\windows\system32\ tasks\microsoft\windows\shell\##HASH## 我怎样才能改进 re 说它应该在名称中至少有一个数字或 k 个数字。谢谢。
  • 您可以使用负前瞻(?=.*\d)[a-z\d]{32}。如果您需要进一步调整正则表达式,请使用 regex101.com 您可以编辑正则表达式并实时查看结果
  • 非常感谢。如果我还有其他不清楚的地方,您认为我可以在评论部分打扰您吗?
【解决方案2】:

这可能会有所帮助:

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 中修改该值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 2019-02-03
    • 2012-01-09
    • 1970-01-01
    • 2018-07-13
    • 2017-02-18
    • 2017-02-04
    相关资源
    最近更新 更多