如何在正则表达式中使用带有字符的“环视”来捕获整个字符串?
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
也是允许的。
您不需要向前或向后看。
编辑:
是的,还要匹配babab
(b
两个a
的共享)等等。它应该是
re.findall(r'(b+a)+b+',mystring);
【讨论】:
谢谢。但如果字符串包含多个 'a' 实例,例如 'babbab' 、 'babbab' 、 'babbab' ,则它不起作用以上是关于如何在正则表达式中使用带有字符的“环视”来捕获整个字符串?的主要内容,如果未能解决你的问题,请参考以下文章