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

时间:2016-09-25 08:42:29

标签: python regex

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

Method-1

我正在

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

但我想要

'-match- match'

编辑:

或者字符串'-word- match'

我想要

"word -word-"

3 个答案:

答案 0 :(得分:7)

你需要的是负面的背后隐藏。

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

引用documentation

  

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

,则匹配

因此,只有在分词\b前面没有减号-时才会匹配。

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

答案 1 :(得分:2)

\b基本上表示除[a-zA-Z0-9_]以外的字符的单词边界,其中也包含空格。使用负面外观环绕word以确保在其之前和之后没有非空格字符:

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

答案 2 :(得分:0)

您还可以使用(\s|^)(\s|$)模式匹配单词前后的字符,而不是单词边界。

细分\s匹配每个空格字符,这似乎是您要尝试实现的字符,因为您要排除短划线。 ^$确保如果单词是字符串中的第一个或最后一个(即之前或之后没有字符),那么它们也是匹配的。

您的代码会变成这样:

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

因为此解决方案使用\s等字符类,所以这意味着可以轻松替换或扩展这些类。例如,如果您希望用空格或逗号分隔您的单词,您的模式将变为如下所示:r'(,|\s|^)(word)(,|\s|$)'