具有连续变量的正则表达式字符串

Regular expression strings with consecutive variables

我对 regex(正则表达式)还很陌生,需要一些帮助来构造字符串。我大部分都理解它,但是当我需要匹配的文本有变量后跟一个可选短语时,我感到很困惑。

假设文本的格式类似于 "turn [the] lights",其中“$1”是我想要的变量,而 "the" 可以包含或省略。我已经尝试了以下简介 "turn (.+) (?:the)?\s*lights",它适用于 "turn on 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",)

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

你只需要为此使用惰性量词:

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

RegEx Demo

如果我对问题的理解正确,那么您正在尝试编写一个正则表达式来匹配包含但不限于以下内容的短语:

  • 开灯
  • 关灯
  • 开灯
  • 关灯

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

turn (.+?) (the )?lights

按部分细分:

  • turn: 直截了当。
  • (.+?):捕获一个或多个任意字符,但?表示不贪心。你可以阅读贪婪here
  • (the )? 被括号括起来,使 ? 应用于整个单词,使整个 the 成为可选的。这也将创建一个捕获组,但您可以安全地忽略这一事实。
  • lights: 直截了当。