我将代码简化为我遇到的具体问题。
Method-1
我正在
import re
pattern = re.compile(r'\bword\b')
result = pattern.sub(lambda x: "match", "-word- word")
但我想要
'-match- match'
编辑:
或者字符串'-word- match'
我想要
"word -word-"
答案 0 :(得分:7)
你需要的是负面的背后隐藏。
pattern = re.compile(r'(?<!-)\bword\b')
result = pattern.sub(lambda x: "match", "-word- word")
,则匹配
(?<!...)
如果字符串中的当前位置前面没有匹配....
因此,只有在分词\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|$)'
。