2014-10-03 70 views
0

模糊標題的道歉。無法正確處理括號的正則表達式

我試圖讓一個正則表達式,搜索和OKS是這樣的:在

「品牌新的歌曲[示範]」

通過尋找「[示範]」的地方該字符串使用re.search()。這裏是什麼,我認爲應該返回True一個例子:

bool (re.search (r"\b\[Demonstration\]\b", "Brand New Song [demonstration]", re.IGNORECASE)) 

去就更簡單了,這也將返回False:

bool (re.search (r"\b\[\b", " [ ")) 

我一直在使用\b的開始和捕捉串的兩端因爲它應該表示一個詞的開頭或結尾處的任何空白字符串(as per documentation here),並且我看不到我搞亂了什麼。)

繼續困惑,以下返回true:

bool (re.search (r"\b\[\b", "_[_")) 

這是同樣令人困惑,因爲\b定義部分爲「......空白或者非字母數字,非下劃線。」所以,請幫我看看是什麼愚蠢的細節我很可能會錯過,謝謝!

回答

2

您需要從模式中刪除字邊界\b

>>> import re 
>>> s = 'Brand New Song [demonstration]' 
>>> bool(re.search (r'\[Demonstration\]', s, re.IGNORECASE)) 
True 

單詞邊界不消耗任何字符,它斷言一方有一個字符,另一方面沒有。正如regular-expressions.info documentation說:

有跡象表明,有資格作爲單詞邊界的三個不同位置:

  • 字符串中的第一個字符之前,如果第一個字符是一個單詞字符。
  • 在字符串中的最後一個字符後面,如果最後一個字符是單詞字符。
  • 字符串中的兩個字符之間,其中一個是單詞字符,另一個不是單詞字符。
+0

我不知道他們是怎麼操作的。我如何處理在方括號外面有空白或沒有任何東西?因此,「這是[測試]」將是真實的,但「這[應該]是假的」會是假的? – Befall 2014-10-03 22:40:33

+0

您可以使用非單詞邊界'\ B'或使用lookaround斷言。即(?<!\ S)\ [[^]] * \](?!\ S)' – hwnd 2014-10-03 22:44:33