如何编写正则表达式以匹配特定单词?


21

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

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

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

但在类似以下内容中发现时,不会触发ROCKET

Rocketeer
Sprocket

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


1
这是该问题[更常见]可能更适合堆栈溢出的情况之一。确保提供一种语言和/或平台,因为每种语言都有其自身的特点。例如,Windows。.Net和Regex类。(通常,反之亦然。Stack Overflow从开发人员那里获得了数百个题外的问题,这些问题更适合于超级用户)。
jww 2015年

Answers:


14

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

您希望对由非字母数字字符包围的“火箭”一词实现不区分大小写的匹配。一个有效的正则表达式为:

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

它的作用是查找零个或多个(*)非字母数字(\ W)字符,然后是不区分大小写的火箭((?i)rocket(?-i)),然后是零个或多个( *)非字母数字字符(\ W)。火箭匹配项周围的多余括号将匹配分配给一个单独的组。因此,“火箭”一词将属于比赛组1。

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

\W*(rocket)\W*

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

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

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


1
在线使用正则表达式测试器(例如regex101.com对其进行测试将其显示为无效且与我输入的示例字符串不匹配。它旨在用作python脚本的一部分。这对它的书写方式有什么影响吗?
凯夫卡2015年

1
是的,它确实。您可以在regex101.com上看到可以在左上角选择正则表达式“风味”,而python则略有不同。我将使用等效的python更新我的答案。
Xaser

1
谢谢。我认为正则表达式基本上是独立于语言的。
凯夫卡2015年

1
它们应该是,但是在实现上存在细微的差异。
Xaser

2
\W*(rocket)\W*火柴lrocketl。它应该是(?:^|\W)(rocket)(?:$|\W)(没有*和,您必须检查它是否与字符串的开头和/或结尾匹配)。
Ismael Miguel

10

我认为在这种情况下,先行预测是过大的,最好使用带有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']

从技术上讲,非捕获组不是环顾四周,但是/ b选项产生的结果与Ismael的解决方案完全相同,但可能更优雅一些。
Xaser 2015年

1

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

grep -i '\<rocket\>'

我不知道使所有正则sed表达式不区分大小写的任何方法,但是总有穴居人的方法:

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

0

使用“仅搜索整个单词”选项。

至于标点符号,直到您知道其味道之前,您都无法回答。

这是一个非常老的线程,因此发布给以后有需要的人。发起线程的人可能已经转移到其他地方...不?


whole words only option使用什么grepphp?抱歉,与其他答案相比,您的答案没有任何附加值。
Toto
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.