如何使字边界\ b在破折号上不匹配

alp*_*pal 7 python regex

我将代码简化为我遇到的具体问题.

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

我正进入(状态

'-match- match'
Run Code Online (Sandbox Code Playgroud)

但我想要

'-word- match'
Run Code Online (Sandbox Code Playgroud)

编辑:

或者是字符串 "word -word-"

我想要

"match -word-"
Run Code Online (Sandbox Code Playgroud)

Mat*_*ias 7

你需要的是消极的看法.

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

引用文档:

(?<!...) 匹配如果字符串中的当前位置没有匹配....

因此,如果单词\b分隔符号前面没有减号,则只会匹配-.

如果您需要在字符串的末尾使用它,则必须使用负向前瞻,如下所示:(?!-).然后,完整的正则表达式将导致:(?<!-)\bword(?!-)\b


rev*_*evo 1

\b基本上表示字符上的单词边界,除此之外[a-zA-Z0-9_]还包括空格。用负环视包围word以确保其前后没有非空格字符:

re.compile(r'(?<!\S)word(?!\S)')
Run Code Online (Sandbox Code Playgroud)