正则表达式不替换以“。”开头的单词。或以“+”结尾,如“.NET”或“C ++”

时间:2017-08-22 09:21:59

标签: python regex

我正在尝试将'.net'中的'i like .net'替换为.NET。预期输出:'i like .NET'.

'c++' 'i like c++' Cpp 'i like Cpp'.。预期输出: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

有更多特殊字符的情况,例如'c ++'

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`

更新:

ComponentName thisWidget = new ComponentName( getContext(), <ProviderClass> );
AppWidgetManager.getInstance( getContext() ).updateAppWidget( thisWidget, rempoteViews );

我在regex replace上经历了很多stackoverflow问题。在任何地方它建议逃跑'。',我试过,你可以看到上面。仍然没有用。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:5)

请勿在点之前放置\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

答案 1 :(得分:2)

\b之前的..之前需要单词char。 \b\..中的ASP.NET匹配,但不会与In .NET中的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. 匹配。

如果你想匹配整个单词而不管搜索单词开头/结尾的字符,最好的办法是使用lookarounds:

net

请参阅Python demo。如果您使用.net代替(?<!\w)(参见another Python demo),它仍将保持不变。

这里,(?!\w)将在搜索词之前需要非单词char或字符串的开头,而{{1}}将在搜索词之后立即需要非单词char或字符串结尾。