Python re正则匹配异常:TEMP目录下带Zone ID的exe文件匹配问题
搞定%TEMP%目录下带Zone.Identifier的.exe文件正则匹配问题
嘿,我来帮你分析下为什么filepath1匹配失败,而filepath2成功,以及怎么修正这个正则表达式~
问题出在哪?
你的代码里有两个核心问题导致了匹配不一致:
- 路径字符串的转义坑:你定义
filepath1和filepath2时没加r(原始字符串标记),Python会把路径里的反斜杠当成转义字符处理。比如\U会被尝试解析成Unicode转义,这直接导致实际存储的路径和你写的不一样,正则自然匹配不上。 - 正则的匹配范围写错了:你用的
[^.]*是匹配除了点之外的所有字符,但咱们要的是匹配Temp目录下的任意文件名(哪怕文件名里有多个点也没关系),直到.exe:Zone.Identifier。正确的应该是匹配除了路径分隔符(反斜杠)之外的所有字符,因为反斜杠是目录的分隔,文件名里的其他字符都应该被允许。
修复后的完整代码
直接看修正后的代码吧,我把两个问题都解决了:
#!/usr/bin/env python try: import re2 as re except ImportError: import re # 加r用原始字符串,避免反斜杠被转义 filepath1 = r"C:\Users\Administrator\AppData\Local\Temp\77ce4ba2a605e22b8699eef874d075fb585d259ed6cade2e503e6dbf58020aa0.exe:Zone.Identifier" filepath2 = r"C:\Users\Administrator\AppData\Local\Temp\svchost.exe:Zone.Identifier" # 同样用原始字符串写正则,把[^.]*换成[^\\]*匹配任意文件名 re_pattern = re.compile(r"C:\\Users\\[^\\]*\\AppData\\Local\\Temp\\[^\\]*\.exe:Zone\.Identifier") print("1: " + str(re_pattern.search(filepath1))) print("2: " + str(re_pattern.search(filepath2)))
关键修改说明
- 原始字符串(r前缀):这是处理Windows路径和正则的必备操作!加了
r之后,Python就不会把反斜杠当成转义字符,路径和正则里的反斜杠都会被当作普通字符处理,避免各种莫名其妙的匹配失败。 - 正则匹配范围调整:把
[^.]*改成[^\\]*,这样就能匹配Temp目录下的任何文件名(不管有没有点),只要后面跟着.exe:Zone.Identifier就行。 - 简化转义逻辑:用原始字符串写正则,你只需要写
\\来匹配一个反斜杠,不用再考虑Python层面的额外转义,写起来更省心。
更灵活的匹配方案(可选)
如果你想适配更多场景(比如不同系统的Temp目录位置可能略有不同,或者大小写差异),可以试试这个更通用的正则:
re_pattern = re.compile(r".*Temp\\[^\\]*\.exe:Zone\.Identifier", re.IGNORECASE)
这个正则会忽略大小写,而且能匹配任何包含Temp目录的路径下的目标文件,适用性更广~
内容的提问来源于stack exchange,提问作者Brae
相关产品推荐
相关产品推荐

