Python正则表达式替代
我正在尝试匹配以下语言:Python正则表达式替代,python,regex,Python,Regex,我正在尝试匹配以下语言: L = {a^nb^m | (n+m) is even } 也就是说,na后面跟着mb,所以(n+m)是偶数。我构建以下正则表达式 ((aa)*(bb)*)|(a(aa)*b(bb)*) 但它只匹配备选方案的第一部分,而不匹配第二部分(使用测试)。它不会匹配aaabbb。当我删除第一个选项时,只剩下(a(aa)*b(bb)*),aaabbb正好匹配。我遗漏了什么?这里的主要标准是n+m是偶数,因此您可以尝试: ^(?=(?:..)+$)a+b+$ 在线查看 ^-
L = {a^nb^m | (n+m) is even }
也就是说,na后面跟着mb,所以(n+m)是偶数。我构建以下正则表达式
((aa)*(bb)*)|(a(aa)*b(bb)*)
但它只匹配备选方案的第一部分,而不匹配第二部分(使用测试)。它不会匹配aaabbb。当我删除第一个选项时,只剩下(a(aa)*b(bb)*),aaabbb正好匹配。我遗漏了什么?这里的主要标准是n+m是偶数,因此您可以尝试:
^(?=(?:..)+$)a+b+$
在线查看
-启动字符串锚定^
-正向前瞻:(?=
-非捕获组:(?:
-除换行符以外的任意两个字符。
-关闭非捕获组,并匹配1+时间到结束字符串)+$
-关闭正向前瞻)
-1+乘以一个“a”和1+乘以一个“b”a+b+
-结束字符串锚定$
如果您希望将“bb”与“a^0”视为有效输入的位置匹配,我想您可以将
a+b++
中的+
更改为*
。。但是你知道为什么我上面的代码不起作用吗?“另类”接线员我遗漏了什么?@fabian;您已经忘记了开始/结束字符串锚定。是一个使用非捕获组而不是捕获组的工作示例。非常感谢HJVDV:我仍然有点困惑,到底是什么解决了上面的表达式。我对你表达的“最重要”的改变似乎是在第一个“备选方案”中从*到+。即:((aa)*(bb)*)|(a(aa)*b(bb)*)->((aa)+(bb)+)|(a(aa)*b(bb)*)。因此,上一条注释中的表达式不再与bb()匹配。如果将“+”改为“*”量词,则会出现这种情况,否则表达式至少会有一个“a”。看见现在的问题是,也可能什么都没有。一个空字符串get进行验证。从理论上讲,它会处理您的条件,但如果您不是在寻找一个空字符串,那么您需要包括一个测试来防止出现空字符串。不管是哪种方式……使用我在答案中提到的更简单的解决方案=)