正则表达式中的 Python 正则表达式否定

标签 python regex

给定:

ABC
content 1
123
content 2
ABC
content 3
XYZ

是否可以创建一个正则表达式来匹配“ABC[\W\w]+?XYZ”的最短版本

本质上,我正在寻找“ABC 后跟任何以 XYZ 结尾的字符,但如果我在两者之间遇到 ABC 则不匹配”(但将 ABC 视为潜在的正则表达式本身,因为它并不总是设置长度...所以 ABC 或 ABcC 也可以匹配)

因此,更一般地说:REGEX1 后跟任何字符并以 REGEX2 终止,如果 REGEX1 出现在两者之间则不匹配。

在这个例子中,我不想要前 4 行。

(我确定这个解释可能需要......进一步解释哈哈)

编辑:

好吧,我明白现在需要进一步解释了!感谢到目前为止的建议。在我开始研究如何将您提出的每个解决方案应用于我的问题时,我至少会给您更多的思考空间。

建议1:反转字符串内容和正则表达式。

这当然是一个非常有趣的 hack,它根据我的解释解决了问题。在简化问题时,我也没有提到同样的事情可能会反过来发生,因为结束签名也可能在以后存在(并且已证明在我的特定情况下)。这就引入了如下所示的问题:

ABC
content 1
123
content 2
ABC
content 3
XYZ
content 4
MNO
content 5
XYZ

在这种情况下,我会检查类似“ABC through XYZ”的内容,意思是捕捉 [ABC, content 1, XYZ]...但不小心捕捉到了 [ABC, content 1, 123, content 2, ABC, content 3 , XYZ]。反转它会捕获 [ABC, content 3, XYZ, content 4, MNO, content 5, XYZ] 而不是我们再次想要的 [ABC, content 2, XYZ]。重点是尽量使其尽可能通用,因为我还将搜索可能具有相同起始签名(在本例中为正则表达式“ABC”)和不同结束签名的内容。

如果有一种方法可以构建正则表达式以封装此类限制,那么在我构建正则表达式以在此类字符串中搜索时仅引用它可能会更容易,而不是创建自定义处理它的搜索算法。

建议 2: A+B+C+[^A]+[^B]+[^C]+XYZ 带有 IGNORECASE 标志

这在 ABC 是有限的情况下看起来不错。尽管将其本身视为正则表达式。例如:

Hello!GoodBye!Hello.Later.

我正在尝试做的事情的非常简化的版本。我想要“Hello.Later”。给定起始正则表达式 Hello[!.] 和结束 Later[!.]。运行像 Hello[!.]Later[!.] 这样简单的东西会获取整个字符串,但我想说的是如果起始正则表达式 Hello[!.] 存在于找到的第一个起始正则表达式实例和第一个结束正则表达式之间找到实例,忽略它。

这个提议下面的convo表明我可能会受到类似于括号匹配问题的常规语言限制的限制(谷歌它,想想很有趣)。这篇文章的目的是看看我是否真的必须求助于创建一个底层算法来处理我遇到的问题。如果可能的话,我非常想避免它(在我上面给你的简单示例中,设计有限状态机非常容易......我希望随着它变得稍微复杂一点)。

提案 3: ABC(?:(?!ABC).)*?XYZ with DOTALL flag

如果它实际上允许 ABC 成为正则表达式,我喜欢这个想法。明天到办公室时,我将不得不探索这个问题。乍一看没什么特别的,但我对 python 正则表达式是全新的(并且对在代码中实际应用正则表达式而不仅仅是理论上的作业是新的)

最佳答案

正则表达式解决方案是 ABC(?:(?!ABC).)*?XYZ 带有 DOTALL 标志。

关于正则表达式中的 Python 正则表达式否定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10989198/

相关文章:

Python文件路径和大小

python - 可能的 Python Flask 内存泄漏

Python re.findall() 不会终止

JavaScript 正则表达式不匹配

java - 如何在 Java 中的 String.contains() 方法中使用正则表达式

python - 使用 groupby 遍历组时删除原始索引

python - 用于 Windows XP 的 opencv

python - 在 python 中合并两个列表 - 但在合并期间对它们进行排序

javascript - 如何在 JavaScript 中将很长的正则表达式拆分为多行?

python - 正则表达式 - 替换字符串直到遇到第二个大写字母