有一个非常复杂的正则表达式。
但我有个问题。如果后面有字母,#++字符将被删除。
问题:如何为当前(C++和C语言符号)的正则表达式添加一个异常?
我使用了下一个regex:

import re

text = 'Must-have skills: -.Net programming experience; -2 years experience in C++; C#/.Net, C++/.Net, C./.Net.'
text = re.sub(r'[!,.:;—](?= |$)', ' ', text)
print(re.sub(r'(?i)(?:(?!\.net\b|\b-\b)[^\w\s])+(?=[^\w\s]*\b)', ' ', text))

我得到了下一个结果:
'Must-have skills   .Net programming experience   2 years experience in C++  C .Net  C .Net  C .Net '

预期结果:
'Must-have skills   .Net programming experience   2 years experience in C++  C# .Net  C++ .Net  C .Net '

当前regex详细信息
(?i)-打开不区分大小写模式
(?:(?!\.net\b|\b-\b)[^\w\s])+-任何标点字符([^\w\s]),一次或多次出现,尽可能多,不开始任何序列:
\.net\b-.net作为一个整体
|-或
\b-\b-连字符
(?=[^\w\s]*\b)-一个正面的展望,需要0+标点字符,后跟紧靠当前位置右侧的单词边界位置。

最佳答案

编辑
#1个
与下面一样,但更短,我定义的字符必须先于捕获的所有在一套

>>> import re

>>> text = 'Must-have skills: -.Net programming experience; -2 years experience in C++; C#/.Net, C++/.Net, C./.Net.'

>>> re.sub('(?:(?<!\S)|(?<=[\s\+\.C#]))[\-!,.:;—/]|[\-!,.:;—/](?=\s|$)', ' ', text)


#Output
'Must-have skills   .Net programming experience   2 years experience in C++  C# .Net  C++ .Net  C  .Net '

是的。
解释
这里的答案实际上跟下面的一样,但不是声明必须在一个接一个地作用的捕获集合之前的字符,而是将它们定义为一个集合中的所有字符。
是的。
α2
有点肮脏,但是
稍后会发布一个解释;甚至可以改进它以获得更好的可读性。
>>> import re

>>> text = 'Must-have skills: -.Net programming experience; -2 years experience in C++; C#/.Net, C++/.Net, C./.Net.'

>>> re.sub('(?:(?<!\S)|(?<=\s)|(?<=\+)|(?<=\.)|(?<=C)|(?<=#))[\-!,.:;—/]|[\-!,.:;—/](?=\s|$)', ' ', text)


#Output
'Must-have skills   .Net programming experience   2 years experience in C++  C# .Net  C++ .Net  C  .Net '

是的。
编辑:解释
因此,通过使用(?:打开,我打开时说,在这种情况下,我要捕获的查询应该在捕获集之前,捕获集包含紧跟在(?:后面定义的任何内容。
这里的关键是不能将以(?<!(?<=开头的lookaheads设置为忽略一系列值,因此我必须首先以(?:开头,然后给出多个(?<!(?<=来说明捕获的内容应该或不应该以这个字符开头,而不是以这个其他字符开头,以此类推
因此,使用(?:打开后,我现在能够设置捕获的内容应该或不应该在前面加上
(?<!\S)开始确实不需要它,但我包括它,因为它投射了一个安全网。它基本上说,如果在[\-!,.:;—/]范围之前有任何随机的非空白字符,则不应捕捉该范围或对其执行操作
对于|(?<=\s)我是说*或[\-!,.:;—/]应该被捕获/执行,如果它前面有任何一个空白字符
对于|(?<=\+)|(?<=\.)|(?<=C)我说的或[\-!,.:;—/]应该被捕获/执行,如果它前面是+,,或c,那么\. OR just . [a period]中的[\-!,.:;—/]将被捕获/执行,如果它前面是C类似于字符串中的(?<=C)(记住;);并且[\-!,.:;—/]中的+将被捕获/执行,如果它前面是(?<=\+)(记住))。
|关闭(?:之前的最后一个|
[\-!,.:;—/]如您所知是或,并且由于我不能使语句成为一体式语句,所以我必须重新定义[\-!,.:;—/],然后向前看,如果OR statements后跟空白或字符串结尾,则对其执行捕获/操作。使用lookaheads,您可以定义常规的单字符串类型“ranges”,这样您就可以在其中实际使用,但是当您使用lookaheads时就不能

09-07 16:28