有一个非常复杂的正则表达式。
但我有个问题。如果后面有字母,#
和++
字符将被删除。
问题:如何为当前(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时就不能