5

我想在我的磁盘上搜索一个名为“AcroTray.exe”的文件。如果文件位于 "Distillr" 以外的目录中,则程序应打印警告。我使用以下语法来执行否定匹配

(?!Distillr)

问题是虽然我使用“!” 它总是产生 MATCH。我尝试使用 IPython 找出问题,但失败了。这是我尝试过的:

import re

filePath = "C:\Distillr\AcroTray.exe"

if re.search(r'(?!Distillr)\\AcroTray\.exe', filePath):
    print "MATCH"

它打印一个 MATCH。我的正则表达式有什么问题?

我想参加比赛:

C:\SomeDir\AcroTray.exe

但不在:

C:\Distillr\AcroTray.exe
4

4 回答 4

1

使用否定的lookbehind ( (?<!...)),而不是否定的lookahead:

if re.search(r'(?<!Distillr)\\AcroTray\.exe', filePath):

这匹配:

In [45]: re.search(r'(?<!Distillr)\\AcroTray\.exe', r'C:\SomeDir\AcroTray.exe')
Out[45]: <_sre.SRE_Match at 0xb57f448>

这不匹配:

In [46]: re.search(r'(?<!Distillr)\\AcroTray\.exe', r'C:\Distillr\AcroTray.exe')
# None
于 2013-03-20T20:41:08.730 回答
0

您正在尝试使用负面的后视:(?<!Distillr)\\AcroTray\.exe

于 2013-03-20T20:41:19.050 回答
0

你想要向后看,而不是向前看。像这样:

(?<!Distillr)\\AcroTray\.exe
于 2013-03-20T20:41:37.543 回答
0

(?mx)^((?!Distillr).)*$

查看您提供的示例,我在这里使用它们作为示例

于 2013-03-20T20:42:59.133 回答