2010-10-22 22 views
56

雖然試圖學習更多關於正則表達式的知識,但教程建議您可以使用\ b來匹配單詞邊界。然而,由於預計在Python解釋器下面的代碼片段不起作用:Python重新模塊支持單詞邊界( b)嗎?

>>> x = 'one two three' 
>>> y = re.search("\btwo\b", x) 

Ÿ應該有一個匹配對象,如果什麼是匹配的,但它是無。 \ b表達式在Python中是不支持的還是我用它錯了?

感謝您的任何幫助。

+20

這將工作:'re.search(r「\ btwo \ b」,x)' – Bolo 2010-10-22 08:39:13

+4

爲什麼不使用「原始」字符串? 'R 「\ btwo \ B」'? – 2010-10-22 10:56:13

+0

關於'\ b的人們[經常感到困惑](http://stackoverflow.com/questions/4213800/is-there-something-like-a-counter-variable-in-regular-expression-replace/4214173#4214173) '。 – tchrist 2010-11-18 13:55:08

回答

58

你爲什麼不嘗試

word = 'two' 
re.compile(r'\b%s\b' % word, re.I) 

輸出:

>>> word = 'two' 
>>> k = re.compile(r'\b%s\b' % word, re.I) 
>>> x = 'one two three' 
>>> y = k.search(x) 
>>> y 
<_sre.SRE_Match object at 0x100418850> 

也忘了提,你應該在你的代碼中使用原始字符串

>>> x = 'one two three' 
>>> y = re.search(r"\btwo\b", x) 
>>> y 
<_sre.SRE_Match object at 0x100418a58> 
>>> 
+0

有趣的是,感謝您的工作示例。你有什麼洞察力,爲什麼我選擇的方法不起作用?這兩種方法應該是一樣的,只是在你的方法中你只編譯一次。 – 2010-10-22 08:42:54

+0

@darren:看到我的最後一個例子,它改進了你的工作。我提供了原始字符串進行搜索。 – pyfunc 2010-10-22 08:44:59

+1

ahh在你和Bolo的建議後,這是因爲我沒有使用原始字符串。謝謝! – 2010-10-22 08:46:42

50

這將工作:re.search(r"\btwo\b", x)

當您在Python中編寫"\b"時,它是單個字符:"\x08"。要麼逃避這樣的反斜線:

"\\b" 

或寫入原始字符串是這樣的:

r"\b" 
+2

這真的幫助了我......我正在用pyspark rlike正則表達式掙扎,並且無法弄清楚爲什麼\ b(字邊界)不起作用。謝謝 – jb1t 2016-06-17 23:09:14

3

Python文檔

https://docs.python.org/2/library/re.html#regular-expression-syntax

\ b

匹配空字符串,但僅限於單詞的開頭或結尾。一個單詞被定義爲一個字母數字或下劃線字符序列,因此單詞的末尾用空格或非字母數字,非下劃線字符表示。請注意,在形式上,\ b被定義爲\ w和\ w字符之間的邊界(反之亦然),或\ w和字符串的開始/結尾之間的邊界,所以被認爲是字母數字的精確字符集取決於在UNICODE和LOCALE標誌的值上。例如,r'\ bfoo \ b'匹配'foo','foo。','(foo)','bar foo baz',但不匹配'foobar'或'foo3'。在字符範圍內,\ b代表退格字符,以便與Python的字符串文字兼容。