我应该如何编写正则表达式来匹配特定单词?

Kef*_*fka 31 regex

我一直在尝试让一个特定的正则表达式工作,但我无法让它做我需要的。

基本上,我希望它寻找 ROCKET。正则表达式应该匹配 ROCKET 大写或小写,有或没有标点符号,但不是另一个单词的一部分。因此,正则表达式将触发以下任何一项:

rocket
RoCKEt
hi Rocket
This is a rocket.
ROCKET's engine
Run Code Online (Sandbox Code Playgroud)

但是当它在类似的东西中被发现时不会在 ROCKET 上触发

Rocketeer
Sprocket
Run Code Online (Sandbox Code Playgroud)

我一直在尝试使用在线正则表达式生成器使其正确,但无法完全匹配。

Xas*_*ser 20

我建议为MSDN 正则表达式快速参考添加书签

您想为由非字母数字字符包围的单词“rocket”实现不区分大小写的匹配。一个有效的正则表达式是:

\W*((?i)rocket(?-i))\W*

它会做的是查找零个或多个 (*) 非字母数字 (\W) 字符,然后是不区分大小写的火箭版本 ( (?i)rocket(?-i) ),然后是零个或多个 ( *) 非字母数字字符 (\W)。火箭匹配项周围的额外括号将匹配分配给一个单独的组。因此,火箭一词将在比赛组 1 中。

更新 1: Matt 在评论中说这个正则表达式将在 python 中使用。Python 的语法略有不同。要在 python 中获得相同的结果,请使用此正则表达式并将re.IGNORECASE选项传递给compileormatch函数。

\W*(rocket)\W*

Regex101 上,这可以通过在正则表达式输入旁边的文本框中输入“i”来模拟。

更新 2 Ismael 已经提到,正则表达式不太正确,因为它可能匹配“1rocket1”。他发布了一个更好的解决方案,即

(?:^|\W)rocket(?:$|\W)

  • 并且 `\W*(rocket)\W*` 匹配 `lrocketl`。它应该是`(?:^|\W)(rocket)(?:$|\W)`(没有`*`,你必须检查它是否与字符串的开头和/或结尾匹配)。 (2认同)

ber*_*roe 16

我认为在这种情况下前瞻是矫枉过正的,你最好在ignorecase选项中使用单词边界,

\brocket\b

换句话说,在python中:

>>> x="rocket's"
>>> y="rocket1."
>>> c=re.compile(r"\brocket\b",re.I)  # with the ignorecase option
>>> c.findall(y)
[]
>>> c.findall(x)
['rocket']
Run Code Online (Sandbox Code Playgroud)