2011-11-29 58 views
0

也許一個愚蠢的問題,但雖然谷歌返回了很多類似的情況下,我無法找到確切的情況:什麼正則表達式將匹配所有字符串不包含特定的字符串。例如,我想匹配任何不包含'foo_'的字符串。 現在,Python re:否定正則表達式的一部分

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') 

它返回匹配。 我故意排除了最初的。*或。*?在那裏。但同樣的事情發生在那。

任何想法爲什麼這種奇怪的行爲? (我需要這個作爲單個正則表達式 - 作爲用戶輸入輸入)。

回答

2

你使用,你需要向前斷言後向斷言:

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

將工作(即不匹配。)。

(?!.*foo_)意味着「斷言,它不可能從字符串中的當前位置匹配.*foo_。由於您使用re.match(),該位置被自動定義爲字符串的開始。

+0

謝謝,我曾試圖用。*(?!foo _)。*展望未來。在「?!」之後錯過了「。*」 。 – subhacom

1

嘗試這種模式,而不是:

^(?!.*foo_).* 

它使用^元字符從字符串的開頭匹配,然後使用負前瞻,用來檢查「foo_」。如果存在,則匹配將失敗。

由於您給出了使用re.match()re.search()兩個示例的示例,因此上述模式適用於兩種方法。但是,如果使用re.match(),則可以安全省略使用^元字符,因爲它將在字符串的開始處匹配,而不像re.search(),它與字符串中的任何位置匹配。

1

我覺得好像有是一個很好的機會,你可以只設計解決這個與條件語句

(這將是很好,如果我們知道你要完成具體是什麼)

爲什麼不:。

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

既然OP想讓它失敗,如果'foo_'在字符串中的任何地方,你應該使用'search'而不是'match',或者更好的是甚至不使用正則表達式:'if'foo_'not some_string:' –

+0

錯誤,優點。我想我只是想回報一些負面結果。 就我個人而言,我認爲「如果不是」比其他解決方案更具可讀性,可讀性對我來說非常重要。 –