Python的正则表达式问题

时间:2018-05-28 15:42:47

标签: python regex re2

尝试使用python re包来查找具有特定模式的文件名。得到了一个测试脚本,它只是硬编码了所有值,但这不是正常使用:

#!/usr/bin/env python

try:
    import re2 as re
except ImportError:
    import re

filepath1 = "C:\Users\Administrator\AppData\Local\Temp\77ce4ba2a605e22b8699eef874d075fb585d259ed6cade2e503e6dbf58020aa0.exe:Zone.Identifier"
filepath2 = "C:\Users\Administrator\AppData\Local\Temp\svchost.exe:Zone.Identifier"
re_pattern = re.compile("C\:\\\\Users\\\\[^\\\\]*\\\\AppData\\\\Local\\\\Temp\\\\[^.]*\.exe\:Zone\.Identifier")

print "1: " + str(re_pattern.search(filepath1))
print "2: " + str(re_pattern.search(filepath2))

由于某种原因,这会返回1表示无,而2表示匹配,但就我可以解决而言,它们都应该匹配。可能只是一个愚蠢的错误,但如果有人能发现它会很棒。

基本上,该模式应匹配任何.exe与%TEMP%目录中的区域ID,无论用户名是什么

2 个答案:

答案 0 :(得分:3)

问题是其中一条路径以7开头,如果您在控制台中尝试\7,您会发现它被解释为代码,因为你没有使用原始前缀作为文字。

>>> print("\7")
<some garbage char, bell?>
>>> print(r"\7")
\7

这说明你的正则表达式并不适用于那个特定的路径(对于你的另一个路径而言,#34;幸运&#34;因为你正在使用Python 2和\ +任何上面的char不是特定的转义序列所以它没有改变(在python 3中,\U被解释!)

现在,对于路径,在这种简单的情况下,您可以使用fnmatch来匹配通配符而不是正则表达式:

import fnmatch

filepath1 = r"C:\Users\Administrator\AppData\Local\Temp\77ce4ba2a605e22b8699eef874d075fb585d259ed6cade2e503e6dbf58020aa0.exe:Zone.Identifier"
filepath2 = r"C:\Users\Administrator\AppData\Local\Temp\svchost.exe:Zone.Identifier"
filepath3 = r"C:\Urs\Administrator\AppData\Local\Temp\svchost.exe:Zone.Identifier"

for f in (filepath1,filepath2,filepath3):
    print(f,fnmatch.fnmatch(f,r"C:\Users\*\AppData\*\Temp\*.exe:Zone.Identifier"))

打印:

C:\Users\Administrator\AppData\Local\Temp\77ce4ba2a605e22b8699eef874d075fb585d259ed6cade2e503e6dbf58020aa0.exe:Zone.Identifier True
C:\Users\Administrator\AppData\Local\Temp\svchost.exe:Zone.Identifier True
C:\Urs\Administrator\AppData\Local\Temp\svchost.exe:Zone.Identifier False

答案 1 :(得分:1)

抱歉,我误解了你的问题。

<_sre.SRE_Match object at 0x03176AE0>
<_sre.SRE_Match object at 0x03176AE0>

<强>输出:

r

请注意文件路径开头的原始字符串({{1}})