我不知道如何编写与这些匹配的正则表达式:
everyone hi
hi everyone
hi
但不是这个:
everyone hi everyone
正则表达式 (?:everyone )?hi(?: everyone)?
也会匹配后者(这不是我想要的)。如何制作这样的正则表达式?或者只是不可能?我无法做足够的研究,因为我无法用正确的语言表达问题。抱歉,如果我发布了重复的内容
答案 0 :(得分:4)
这是完成此操作的蛮力交替方法:
^(?:everyone +hi|hi(?: +everyone)?)$
正则表达式详情:
^
:开始(?:
:开始一个非捕获组
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 demo和this 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']