我一直在尝试让特定的正则表达式工作,但我无法让它满足我的需要。
基本上,我希望它查找 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.IGNORECASE
给compile
或match
函数。
\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