gpt4 book ai didi

python - 向复杂的正则表达式添加异常

转载 作者:太空狗 更新时间:2023-10-30 02:07:05 26 4
gpt4 key购买 nike

有一个非常复杂的正则表达式。

但是我有一个问题。如果 #++ 字符后面有字母,则它们将被删除。

问题:如何为(C++ 和 C# 标记)的当前正则表达式添加异常?

我使用了下一个正则表达式:

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 '

当前的正则表达式详细信息

  • (?i) - 开启不区分大小写模式
  • (?:(?!\.net\b|\b-\b)[^\w\s])+ - 任何标点字符 ([^\w\s]), 出现 1 次或多次,尽可能多,不启动任何序列:
    • \.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 '

.

编辑:解释

  • 所以用 (?: 打开我首先要说的是,在这种情况下,我要捕获的查询应该在捕获集之前,该捕获集包含紧接在 (?: 后面定义的任何内容。 .
  • 这里的关键是以(?<!开头的前瞻。和 (?<=不能设置为忽略一系列值,所以我必须首先从 (?: 开始然后给出多个 (?<!的和(?<=表示捕获的内容应该或不应该以这个字符开头,并且不以其他字符开头,等等
  • 所以用 (?: 打开我现在可以设置捕获的值应该或不应该在
  • 之前
  • (?<!\S) 开头它确实是不需要的,但我把它包括在内是因为它能提供一个安全网。它基本上表示范围 [\-!,.:;—/] 如果前面有任何随机非空白字符,则不应捕获/对其执行操作
  • |(?<=\s)我是说 *OR [\-!,.:;—/]如果它前面有任何单个空白字符,则应该被捕获/采取行动
  • |(?<=\+)|(?<=\.)|(?<=C)我是说 或者 [\-!,.:;—/]如果前面有 +、. 或 C,则应该捕获/执行, 所以 \. OR just . [a period][\-!,.:;—/]如果它前面有C,将被捕获/采取行动就像在你的字符串中(记住 (?<=C) );和 ;[\-!,.:;—/]如果它前面有+,将被捕获/采取行动(记住 (?<=\+) )。
  • 决赛)| 之前关闭 (?: .
  • |如您所知,是 OR,并且因为我不能使该语句成为一个整体,所以我必须重新定义 [\-!,.:;—/]然后向前看说,捕捉/行动 [\-!,.:;—/]如果它后跟空格或字符串的末尾。 通过前瞻,您可以定义常规的单个字符串类型“范围”,这样您就可以实际使用 OR statements在它们中,但当你使用前瞻时你不能

关于python - 向复杂的正则表达式添加异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55185878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com