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

时间:2017-06-06 20:48:49

标签: python regex python-3.x regex-lookarounds

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

我想将“a ... b ... c”匹配为最懒惰的方式(最后一个abc三元组),但正则表达式引擎抓住了更大的“a ... b ... a ... b ......“而且更进一步。

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

3 个答案:

答案 0 :(得分:1)

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

想象一下,jQuery(function() { var $el, leftPos, newWidth, $mainNav = jQuery("#menu-main-menu"); $mainNav.append("<li id='magic-line'></li>"); var $magicLine = jQuery("#magic-line"); if( jQuery('#menu-main-menu .current-menu-ancestor').length ) { var currentPageWidth = jQuery('#menu-main-menu .current-menu-ancestor > a').parent().width(); var currentPageLeft = jQuery('#menu-main-menu .current-menu-ancestor > a').parent().position().left; } if( jQuery('#menu-main-menu .current-menu-item').length ) { var currentPageWidth = jQuery('#menu-main-menu .current-menu-item > a').parent().width(); var currentPageLeft = jQuery('#menu-main-menu .current-menu-item > a').parent().position().left; } $magicLine .width(currentPageWidth) .css("left", currentPageLeft) .data("origLeft", $magicLine.position().left) .data("origWidth", $magicLine.width()); jQuery("#menu-main-menu li").hover(function() { $el = jQuery(this); leftPos = $el.position().left; newWidth = $el.width(); $magicLine.stop().animate({ left: leftPos, width: newWidth }); }, function() { $magicLine.stop().animate({ left: $magicLine.data("origLeft"), width: $magicLine.data("origWidth") }); }); jQuery("#menu-main-menu li .sub-menu li").hover(function() { $magicLine.stop() }, function() { $magicLine.stop().animate({ left: $magicLine.data("origLeft"), width: $magicLine.data("origWidth") }); }); }, 1500); aabcbbffc。然后,你要用

cca

请参阅regex demo

<强>详情:

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

答案 1 :(得分:0)

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

.*(a.*b.*c)

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

一开始贪婪的.*让这找到了最后一个黑社会。

DEMO

答案 2 :(得分:-1)

您可能没有意识到您从@WiktorStribiżew中接受的答案 不符合您的要求。

@WiktorStribiżew答案是(?s)a(?:(?!a).)*?b(?:(?!a).)*?c 只要在任何地方都没有a..b..c,此正则表达式将匹配a序列 哪里有一个点。
这就是所有这个正则表达式。

然而,它不符合您的要求=&gt;

a...b...c
点和点代表a,b和c之间的其他一些(not a, b or c)符号的任意数量。

所以,只是没有a点不能覆盖它 它必须是not a, b or c

正确的方法很简单。这就是为什么我把它放在我的评论中=&gt;

a(?:(?!a|b|c).)*b(?:(?!a|b|c).)*c是唯一的方法。 http://regex101.com/r/uCDgY4/1

我不希望你通过错误的答案得到 sukered

正则表达式扩展

 a                             # 'a'
 (?:                           # Cluster
      (?! a | b | c )               # Assert, not a, b or c
      .                             # Valid
 )*                            # End, 0 to many
 b                             # 'b'
 (?:                           # Cluster
      (?! a | b | c )               # Assert, not a, b or c
      .                             # Valid 
 )*                            #  End, 0 to many
 c                             # 'c'