Python 正则表达式不替换以“quot;开头的单词&引用;或以“结束”+&引用;比如说;。净额;或;C++&引用;

Python 正则表达式不替换以“quot;开头的单词&引用;或以“结束”+&引用;比如说;。净额;或;C++&引用;,python,regex,Python,Regex,我试图用.net替换'I like.net'中的'.net'。预期输出:“我喜欢.NET”。 还有'c++'在'i like c++'中使用Cpp。预期输出:“我喜欢Cpp”。 有更多的情况下使用特殊字符,如“c++” import re regex_match = re.compile(r'\bnet\b') print(regex_match.sub('NET', 'I like .net')) # output I like .NET Which works but I need bou

我试图用
.net
替换
'I like.net'
中的
'.net'
。预期输出:
“我喜欢.NET”。

还有
'c++'
'i like c++'
中使用
Cpp
。预期输出:
“我喜欢Cpp”。

有更多的情况下使用特殊字符,如“c++”

import re

regex_match = re.compile(r'\bnet\b')
print(regex_match.sub('NET', 'I like .net'))
# output I like .NET Which works but I need boundary match also.

regex_match = re.compile(r'\b.net\b')
print(regex_match.sub('NET', 'I like .net'))
# output I like .net

regex_match = re.compile(r'\b\.net\b')
print(regex_match.sub('NET', 'I like .net'))
# output I like .net

regex_match = re.compile(r'\b' + re.escape('.net') + '\b')
print(regex_match.sub('NET', 'I like .net'))
# output I like .net

regex_match = re.compile(r'\b' + re.escape('.net') + '\b')
print(regex_match.sub('NET', 'I like \.net'))
# output I like \.net

print(re.sub(r'\b' + re.escape('.net') + '\b', '.NET', 'I like .net'))
# output I like .net

regex_match = re.compile(r'\b' + re.escape('.net') + '\b')
print(regex_match.sub('NET', re.escape('I like .net')))
# output I\ like\ \.net
更新:

regex_match = re.compile(r'\b' + re.escape('c++') + '\b')
print(regex_match.sub('cpp', 'I like c++'))
# output `I like c++` expected `I like cpp`

我在regex replace上遇到了很多stackoverflow问题。到处都有“逃跑”的建议,正如你在上面看到的,我试过了。但它仍然不起作用。非常感谢您的帮助。

不要将
\b
(单词边界)放在点之前,因为点不是单词字符

您可以使用:

>>> regex_match = re.compile(r'\.net\b')
>>> print(regex_match.sub('.NET', 'I like .net'))
I like .NET

编辑:

根据您的评论,您可能可以使用以下正则表达式:

>>> print(re.sub(r'(^|\s)\.net(?=\s|$)', r'\1.NET', 'I like .net'))
I like .NET

>>> print(re.sub(r'(^|\s)\.net(?=\s|$)', r'\1.NET', 'I like.net'))
I like.net

不要将
\b
(单词边界)放在点之前,因为点不是单词字符

您可以使用:

>>> regex_match = re.compile(r'\.net\b')
>>> print(regex_match.sub('.NET', 'I like .net'))
I like .NET

编辑:

根据您的评论,您可能可以使用以下正则表达式:

>>> print(re.sub(r'(^|\s)\.net(?=\s|$)', r'\1.NET', 'I like .net'))
I like .NET

>>> print(re.sub(r'(^|\s)\.net(?=\s|$)', r'\1.NET', 'I like.net'))
I like.net

\b
之前的
需要在
之前加上单词char。A
\b\.
将与
ASP.NET
中的A
匹配,但与.NET中的
不匹配

如果要匹配整个单词,而不考虑搜索单词开头/结尾的字符,最好使用lookarounds:

import re
regex_match = re.compile(r'(?<!\w){}(?!\w)'.format(re.escape('.net')))
print(regex_match.sub('NET', 'I like .net, not  my.net.'))
# => I like NET, not  my.net.
重新导入

regex_match=re.compile(r’(?A
\b
之前需要一个单词char。A
\b\。
将在
ASP.NET
中匹配
,但在
在.NET
中不匹配

如果要匹配整个单词,而不考虑搜索单词开头/结尾的字符,最好使用lookarounds:

import re
regex_match = re.compile(r'(?<!\w){}(?!\w)'.format(re.escape('.net')))
print(regex_match.sub('NET', 'I like .net, not  my.net.'))
# => I like NET, not  my.net.
重新导入


regex_match=re.compile(r'(?这是一个常见问题。
之前的
\b
要求在
之前有一个char字。你没有。你应该转义点,否则它会匹配任何字符,即
.net
将匹配
anet
,而
\.net
不会。当字符有特殊含义时,你会想转义,但你需要必须表示字符本身。这是一个常见的问题。
之前的
\b
要求在
之前有一个char字。您没有。您应该转义点,否则它会匹配任何字符,即
.net
将匹配
anet
,而
\.net
不会。您将要重新转义字符如果它们有特殊的含义,但你只想表示字符本身。公平点。但是它不能解决
print(regex\u match.sub('.NET','I like my.NET'))的情况。
将输出
我喜欢我的.NET
,这似乎是无法解决的。@VikashSingh那么
r'\s+\.NET\b'
,只有在“.net”后面有一个空格。@anubhava是的。这就是我的想法。只有一个提到的
.net
应该被替换。@WiktorStribiżew looking..@Zinki,那么它在字符串的开头就不匹配了。@Zinki:是的,这是我在编辑的答案中所做的,我相信这对OP.fair point应该是有效的。但它不能解决
打印的问题(regex\u match.sub(“.NET”,“我喜欢我的.NET”)
将输出
我喜欢我的.NET
,这似乎是无法解决的。@VikashSingh那么
r'\s+\.NET\b'
呢,它将只在“.NET”时匹配"跟随一个空格。@anubhava是的。这就是我的想法。只提及
.net
应该被替换。@WiktorStribiżew looking..@Zinki,那么它在字符串的开头就不匹配了。@Zinki:是的,这就是我在编辑的答案中的内容,我相信它应该适用于OP。似乎这可以处理大多数情况。非常感谢。如果它有效的话对于我所有的情况来说,这将是非常棒的。我也有没有特殊字符的单词。我一直在寻找一个可以在所有情况下都能工作的解决方案。@VikashSingh它将处理所有的情况,无论是
.net
net.
还是
net
。就这点而言
。net
是一个完整的单词,即使在
我喜欢.net
@anubhava-fair point.但这是意料之中的。想象一下,当有人写
'I like my..net'
时,他们的意思是
.net
。但在
中,我不喜欢net
或'I like inet`或'my.network`或
I.net
,那么上下文就不会是
.net
。我希望这是有意义的。@anubhava公平点。你的例子更具语义,人类对这句话的解释将揭示出
我喜欢.net
.net
关键字。但是像
I.net
这样的词可能是另一个词,而不是
.net
。这就是为什么这个问题困扰了我一段时间。似乎这可以处理大多数情况。非常感谢。如果它对我所有的朋友都有效的话案例太棒了。我也有一些没有特殊字符的词。我一直在寻找一个可以在所有情况下都能工作的解决方案。@VikashSingh它会处理所有的案例,无论是
.net
net。
还是
net
。就这点而言
。net
是一个完整的词,即使在
我喜欢.net
@anubhava公平点。但是t这是意料之中的事。想象一下,当有人写
'I like my..net'
时,他们的意思是
.net
。但不是在
中,我喜欢net
或'I like inet`或'my.network`或
I.net
,那么上下文就不会是
.net
。我希望这是有意义的。@anubhava公平点。你的例子更语义化,人与人之间的对话这句话的开头会显示出
I喜欢.net
.net
关键字。但是
I.net
可能是另一个词,而不是
.net
。这就是为什么这个问题困扰了我一段时间。