正则表达式不匹配任何组,第一组或第二组,但不能同时匹配。像'NAND'

时间:2021-04-23 14:57:25

标签: python regex

我不知道如何编写与这些匹配的正则表达式:

  • everyone hi
  • hi everyone
  • hi

但不是这个:

  • everyone hi everyone

正则表达式 (?:everyone )?hi(?: everyone)? 也会匹配后者(这不是我想要的)。如何制作这样的正则表达式?或者只是不可能?我无法做足够的研究,因为我无法用正确的语言表达问题。抱歉,如果我发布了重复的内容

3 个答案:

答案 0 :(得分:4)

这是完成此操作的蛮力交替方法:

^(?:everyone +hi|hi(?: +everyone)?)$

RegEx Demo

正则表达式详情:

  • ^:开始
  • (?::开始一个非捕获组
    • everyone:匹配everyone
    • +hi:匹配 1+ 个空格后跟 hi
    • |:或
    • hi:匹配hi
  • (?: +everyone)?:可选匹配 1+ 个空格后跟 everyone
  • ):结束非捕获组
  • $:结束

答案 1 :(得分:3)

您可以明确地为每种情况创建一个正则表达式(第一个将捕获两个),利用行首和行尾标记

(^hi( everyone)?$) (^everyone hi$)

答案 2 :(得分:1)

如果需要将这些文本匹配到更大的文本中,可以使用

\b(?:everyone hi(?! everyone)|(?<!everyone )hi(?: everyone)?)\b

参见regex demo

详情

  • \b - 一个词边界
  • (?: - 非捕获组的开始:
    • everyone hi(?! everyone) - everyone hi 后面没有空格和 everyone
    • | - 或
    • (?<!everyone )hi(?: everyone)? - hi(不紧跟在 everyone 和一个空格之前)和一个可选的空格+everyone
  • ) - 非捕获组结束
  • \b - 一个词边界

使用 PyPi regex,您可以拥有更强大的正则表达式:

\beveryone hi everyone\b(*SKIP)(*F)|\b(?:(?:everyone\s+)?hi(?:\s+everyone)?)\b

this regex demothis Python demo

import regex
text = "everyone hi\nhi everyone\nhi\nBut not this:everyone hi everyone"
rx = r"\beveryone hi everyone\b(*SKIP)(*F)|\b(?:(?:everyone\s+)?hi(?:\s+everyone)?)\b"
print( regex.findall(rx, text) )
## => ['everyone hi', 'hi everyone', 'hi']