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+时间到结束字符串
    • -关闭正向前瞻
  • a+b+
    -1+乘以一个“a”和1+乘以一个“b”
  • $
    -结束字符串锚定

如果您希望将“bb”与“a^0”视为有效输入的位置匹配,我想您可以将
a+b++
中的
+
更改为
*

。但是你知道为什么我上面的代码不起作用吗?“另类”接线员我遗漏了什么?@fabian;您已经忘记了开始/结束字符串锚定。是一个使用非捕获组而不是捕获组的工作示例。非常感谢HJVDV:我仍然有点困惑,到底是什么解决了上面的表达式。我对你表达的“最重要”的改变似乎是在第一个“备选方案”中从*到+。即:((aa)*(bb)*)|(a(aa)*b(bb)*)->((aa)+(bb)+)|(a(aa)*b(bb)*)。因此,上一条注释中的表达式不再与bb()匹配。如果将“+”改为“*”量词,则会出现这种情况,否则表达式至少会有一个“a”。看见现在的问题是,也可能什么都没有。一个空字符串get进行验证。从理论上讲,它会处理您的条件,但如果您不是在寻找一个空字符串,那么您需要包括一个测试来防止出现空字符串。不管是哪种方式……使用我在答案中提到的更简单的解决方案=)