我一直在尝试让一个特定的正则表达式工作,但我无法让它做我需要的。
基本上,我希望它寻找 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
选项传递给compile
ormatch
函数。
\W*(rocket)\W*
在Regex101 上,这可以通过在正则表达式输入旁边的文本框中输入“i”来模拟。
更新 2 Ismael 已经提到,正则表达式不太正确,因为它可能匹配“1rocket1”。他发布了一个更好的解决方案,即
(?:^|\W)rocket(?:$|\W)
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)
归档时间: |
|
查看次数: |
326332 次 |
最近记录: |