2013-10-31 70 views
0

我有这样的文字:连续模式正则表达式

a aa aaa aaa aaaa aa aaa 

,我需要捕获所有的文字aaa序列,但忽略它们,如果有四连胜,像aaaa。在理想情况下,我将能够探测到这种:

a aa **aaa** **aaa** aaaa aa **aaa** 

目前我有这样的正则表达式:

[^a]aaa[^a] 

这与第一个和最后一个序列“AAA”效果很好,但它不能赶上第二个,因为aaa aaa之间的空间属于第一个模式。

a aa **aaa** aaa aaaa aa **aaa** 

关于如何使这个正则表达式的任何想法?

回答

1

我假设你也想抓住aaa,如果它是空间以外的序列的一部分,例如,

aaabbccaabccaccbbbaaaccbbaaaaccbbaacccaaab 
^^^    ^^^     ^^^ 

在这种情况下,负环视将是你最好的选择:

re.findall('(?<!a)aaa(?!a)', mystring) 

(?<!a)指 “不被一个a前面”。

aaa匹配您的三个a s。

(?!a)的意思是“没有跟着a”。

因此,以上只匹配aaa,没有任何额外的a s直接在匹配三之前或之后。

+0

谢谢!这工作完美。 – xcrazy360

5

你可以使用这个表达式:

\ba{3}\b 
  • 这里\b指字边界。
  • a{3}意味着匹配a恰好倍
  • \ba{3}\b意味着匹配3由字边界,因此aaaaaaab包围的的将不被匹配。
+1

是的,描述会很好,但这是答案。请随时使用此[Debuggex Demo](https://www.debuggex.com/r/KGOFqt71Sx-EO4_5) – abc123