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

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

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

基本上,我希望它查找 ROCKET。正则表达式应该匹配大写或小写、带或不带标点的 ROCKET,但当它是另一个单词的一部分时则不匹配。因此,正则表达式会触发以下任何一种情况:

rocket
RoCKEt
hi Rocket
This is a rocket.
ROCKET's engine

但当在类似的地方发现时,不会在 ROCKET 上触发

Rocketeer
Sprocket

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

答案1

我建议收藏MSDN 正则表达式快速参考

您想要实现对非字母数字字符包围的单词“rocket”进行不区分大小写的匹配。有效的正则表达式如下:

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

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

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

\W*(rocket)\W*

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

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

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

答案2

我认为在这种情况下,前瞻是多余的,你最好使用带有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']

答案3

使用grep和 时sed,您可以使用\<rocket\>。使用 时grep,该-i选项将使其不区分大小写(忽略大小写):

grep -i '\<rocket\>'

我不知道有什么方法可以使所有sed正则表达式不区分大小写,但总有原始人的方法:

sed -n '/\<[Rr][Oo][Cc][Kk][Ee][Tt]\>/p'

答案4

我认为你可以用这样的东西来具体表达你想要的词: /^(rocket|RoCKEt)$/g

相关内容