提示需要使用正则表达式环视

Hint on using a regex lookaround needed

假设有一个序列 ...a...b...a...b...c... ,其中 a,b 和 c 是字符串常量。点表示 a、b 和 c 之间任意数量的其他(不是 a、b 或 c)符号。

我想以最懒惰的方式匹配 "a...b...c"(最后一个 a-b-c 三元组),但正则表达式引擎抓住了更大的 "a...b...a...b...c" 并走得更远。

我尝试使用 a\w+b\w+(?!a)\w+ca\w+b\w+?(?!a)\w+?c 等形式的否定前瞻,但到目前为止没有成功。

没有必要为此使用环视。将.*放在正则表达式的开头,将要匹配的内容放入捕获组:

.*(a.*b.*c)

然后使用.group(1)获取捕获组的内容

开头的贪心.*让这个找到了最后一个黑社会

DEMO

你需要在这三个部分之间使用tempered greedy tokens

假设 aabcbbffccca。然后,您将使用

(?s)abc(?:(?!abc).)*?bff(?:(?!abc).)*?cca

regex demo

详情:

  • (?s) - 与 re.Sre.DOTALL 修饰符相同,使 . 匹配换行符
  • abc - 文字字符串 abc 或某种模式 #1
  • (?:(?!abc).)*? - 除换行符之外的任何 0+ 个字符,不开始 abc 序列,尽可能少
  • bff - 文字字符串 bff 或某种模式 #2
  • (?:(?!abc).)*? - 见上文
  • cca - 文字字符串 cca 或某种模式 #3