繁体   English   中英

正则表达式不匹配任何组,第一组或第二组,但不能同时匹配。 像“NAND”这样的东西

[英]Regex match no groups, 1st group OR 2nd group but not both. Something like 'NAND'

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

  • everyone hi
  • hi everyone
  • hi

但不是这个:

  • everyone hi everyone

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

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

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

正则表达式演示

正则表达式详细信息:

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

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

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

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

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

请参阅正则表达式演示

细节

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

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

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

请参阅此正则表达式演示此 Python 演示

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']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM