如何在正则表达式中使用带有字符的“环视”来捕获整个字符串?

Posted

技术标签:

【中文标题】如何在正则表达式中使用带有字符的“环视”来捕获整个字符串?【英文标题】:How to capture the entire string while using 'lookaround' with chars in regex? 【发布时间】:2015-12-31 19:26:42 【问题描述】:

我必须找到所有仅由字母 'a' 和 'b' 组成的字符串,并且每个 'a' 实例都紧跟在 'b' 之后,紧跟在 'b' 之前。

例如:

mystring = 'bab babab babbab ab baba aba xyz'

那么我的正则表达式应该返回:

['bab' 'babab' 'babbab']  

(在字符串 'ab' - 'a' 前面没有 'b'。类似地,'aba' 和 'xyz' 也不是仅由 'a','b' 组成。)

我为此使用了前瞻并编写了这个正则表达式:

re.findall(r'((?<=b)a(?=b))',mystring)

但这只会返回我所有的“a”实例,这些实例后面是“b”,例如:

['a','a','a','a']

但我需要完整的话。如何使用正则表达式找到整个单词?我试图用各种选项修改我的正则表达式,但似乎没有任何效果。如何做到这一点?

【问题讨论】:

【参考方案1】:

您可以使用以下正则表达式:

>>> re.findall(r'\b(?:b+a)+b+\b',mystring)
['bab', 'babab', 'babbab']

Debuggex Demo

从上图中可以看出,此正则表达式将匹配 ba 的任意组合(b 可以出现多次),这会产生每个 a 前面有 b 然后整个字符串后面可以跟一个或多个b

【讨论】:

非常感谢,它有效。我想我必须提高对有限状态机的理解【参考方案2】:

试试

re.findall(r'(b+ab+)+',mystring);

如果bbbabb 也是允许的。 您不需要向前或向后看。

编辑: 是的,还要匹配bababb 两个a 的共享)等等。它应该是

re.findall(r'(b+a)+b+',mystring);

【讨论】:

谢谢。但如果字符串包含多个 'a' 实例,例如 'babbab' 、 'babbab' 、 'babbab' ,则它不起作用

以上是关于如何在正则表达式中使用带有字符的“环视”来捕获整个字符串?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式基本概念

正则表达式:如何在捕获单个组时匹配整个字符串 [重复]

如何在没有环视的情况下在 RegEx 中捕获“搜索”而不是“/搜索”?

正则表达式 - 使用否定环视匹配同句中的单词

字符串中正价的正则表达式

正则表达式高阶技巧之环视(使用python实现)