Python re:否定正则表达式的一部分

时间:2011-11-29 18:05:04

标签: python regex

也许是一个愚蠢的问题,但是虽然谷歌返回了很多类似的案例,但我找不到这种确切的情况:正则表达式将匹配包含特定字符串的所有字符串。例如,我想匹配任何不包含'foo_'的字符串。 现在,

 re.match('(?<!foo_).*', 'foo_bar') 

返回一个匹配项。而

re.match('(?<!foo_)bar', 'foo_bar')

没有。 我尝试了非贪婪的版本:

 re.match('(?<!foo_).*?', 'foo_bar')

仍然会返回一个匹配项。 如果我在后面添加更多字符,

re.search('(?<!foo_)b.*', 'foo_bar')

它返回None,但如果目标字符串有更多的尾随字符:

re.search('(?<!foo_)b.*', 'foo_barbaric')

它返回一个匹配项。 我有意保留了最初的。*或。*?在那里。但同样的事情发生在那里。

任何想法为何会出现这种奇怪的行为? (我需要将它作为单个正则表达式 - 作为用户输入输入)。

3 个答案:

答案 0 :(得分:3)

你正在使用lookbehind断言,你需要先行断言:

re.match(r"(?!.*foo_).*", "foo_bar")

会起作用(即不匹配)。

(?!.*foo_)表示“断言无法从字符串中的当前位置匹配.*foo_。由于您使用的是re.match(),因此该位置会自动定义为字符串。

答案 1 :(得分:1)

请尝试使用此模式:

^(?!.*foo_).*

这使用^元字符从字符串的开头匹配,然后使用检查“foo_”的负前瞻。如果存在,则匹配将失败。

由于您使用re.match()re.search()同时提供了示例,因此上述模式适用于这两种方法。但是,当您使用re.match()时,您可以安全地省略^元字符的用法,因为它将在字符串的开头匹配,而不像re.search()匹配字符串中的任何位置。

答案 2 :(得分:1)

我觉得你很有可能只是用条件陈述来设计它。

(如果我们明确知道你想要完成什么,那就太好了。)

为什么不:

if not re.match("foo", something):
    do_something
else:
    print "SKipping this"