2

我对正则表达式(正则表达式)相当陌生,需要一些帮助来制定字符串。我在很大程度上理解它,但是当我需要匹配的文本有变量后跟一个可选短语时,我感到很困惑。

假设文本的格式类似于“打开 $1 [the] 灯”,其中“$1”是我想要的变量,而“the”可以包含或省略。我尝试了以下简介,“turn (.+) (?:the)?\s*lights”,它适用于“打开灯”:

>>> re.match("turn (.+) (?:the)?\s*lights", "turn on lights").groups()
("on",)

但是当我包含“the”并尝试匹配“turn on the lights”时,我得到“on the”作为我的变量。

>>> re.match("turn (.+) (?:the)?\s*lights", "turn on the lights").groups()
("on the",)

这是可以用正则表达式库完成的吗?如果问题不清楚,我深表歉意,在此先感谢您!

4

2 回答 2

3

您只需要为此使用一个惰性量词:

turn (.+?) (?:the)?\s*lights

正则表达式演示

于 2016-04-15T20:43:53.213 回答
1

如果我正确理解了这个问题,您正在尝试编写一个匹配短语的正则表达式,其中包括但不限于以下内容:

  • 开灯
  • 把灯关掉
  • 开灯
  • 关灯

执行此操作的正则表达式可以这样编写:

turn (.+?) (the )?lights

按部分细分:

  • turn: 直截了当。
  • (.+?): 捕获一个或多个任意字符,但?表示这不会变得贪婪。您可以在此处阅读有关贪婪的信息
  • (the )?用括号括起来,使整个单词都?适用,使整个单词成为the可选的。这也将创建一个捕获组,但您可以放心地忽略这个事实。
  • lights: 直截了当。
于 2016-04-15T20:49:46.387 回答