2016-09-25 24 views
6

我簡化了我的代碼以解決我遇到的特定問題。如何使字邊界 b在短劃線上不匹配

import re 
pattern = re.compile(r'\bword\b') 
result = pattern.sub(lambda x: "match", "-word- word") 

我越來越

'-match- match' 

,但我想

'-word- match' 

編輯:

或爲字符串"word -word-"

我想

"match -word-" 

回答

2

\b基本上表示除包含空格的[a-zA-Z0-9_]以外的字符的字邊界。環繞word負lookarounds,以確保有沒有經過非空格字符,並收到:

re.compile(r'(?<!\S)word(?!\S)') 
6

你需要的是一個消極的後視。

pattern = re.compile(r'(?<!-)\bword\b') 
result = pattern.sub(lambda x: "match", "-word- word") 

舉的documentation

(?<!...) 匹配,如果字符串中的當前位置不匹配的....

因此,這將只匹配前面,如果分詞\b前面沒有減號-

如果你需要這個字符串的末尾,你將不得不使用負面看起來像這樣:(?!-)。完整的正則表達式將導致:(?<!-)\bword(?!-)\b

+0

我該如何確定在 – alpalalpal

+0

這個詞後面沒有破折號我添加了一個解釋。 – Matthias

0

相反字邊界的,你也可以和之前用(\s|^)(\s|$)模式字後匹配的字符。

細分\s匹配每個空格字符,這似乎是您試圖實現的目標,因爲您不包括破折號。 ^$確保如果單詞是字符串中的第一個或最後一個(即,之前或之後沒有字符),那麼它們也匹配。

您的代碼將成爲像這樣:

pattern = re.compile(r'(\s|^)(word)(\s|$)') 
result = pattern.sub(r"\1match\3", "-word- word") 

因爲該解決方案使用字符類,如\s,這意味着那些可以很容易地更換或擴展。例如,如果你想讓你的單詞用空格或逗號分隔,你的模式就會變成這樣:r'(,|\s|^)(word)(,|\s|$)'

相關問題