我簡化了我的代碼以解決我遇到的特定問題。如何使字邊界 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-"
我簡化了我的代碼以解決我遇到的特定問題。如何使字邊界 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-"
\b
基本上表示除包含空格的[a-zA-Z0-9_]
以外的字符的字邊界。環繞word
負lookarounds,以確保有沒有經過非空格字符,並收到:
re.compile(r'(?<!\S)word(?!\S)')
你需要的是一個消極的後視。
pattern = re.compile(r'(?<!-)\bword\b')
result = pattern.sub(lambda x: "match", "-word- word")
(?<!...)
匹配,如果字符串中的當前位置不匹配的....
因此,這將只匹配前面,如果分詞\b
前面沒有減號-
。
如果你需要這個字符串的末尾,你將不得不使用負面看起來像這樣:(?!-)
。完整的正則表達式將導致:(?<!-)\bword(?!-)\b
相反字邊界的,你也可以和之前用(\s|^)
和(\s|$)
模式字後匹配的字符。
細分:\s
匹配每個空格字符,這似乎是您試圖實現的目標,因爲您不包括破折號。 ^
和$
確保如果單詞是字符串中的第一個或最後一個(即,之前或之後沒有字符),那麼它們也匹配。
您的代碼將成爲像這樣:
pattern = re.compile(r'(\s|^)(word)(\s|$)')
result = pattern.sub(r"\1match\3", "-word- word")
因爲該解決方案使用字符類,如\s
,這意味着那些可以很容易地更換或擴展。例如,如果你想讓你的單詞用空格或逗號分隔,你的模式就會變成這樣:r'(,|\s|^)(word)(,|\s|$)'
。
我該如何確定在 – alpalalpal
這個詞後面沒有破折號我添加了一個解釋。 – Matthias