Python 要查找的正则表达式";“ABA”&引用;AABBAA“;或;aaabbaaa“;(直到无限)

Python 要查找的正则表达式";“ABA”&引用;AABBAA“;或;aaabbaaa“;(直到无限),python,regex,Python,Regex,如何编写正则表达式来查找: 阿巴 AAAAA 阿阿巴巴阿 AAABBAAAA AAAAA BBBBB AAAAA 规则: 它总是以一个字母开始和结束 它的中间总是有一个B 第一组A,B组在中间,A组的第二组必须有相同数量的字母。 必须一直有效到无穷大 没有任何可能的正则表达式语言可以描述这一点,因为所描述的语言不是一种语言。 引用上面的维基百科链接: 字母表∑上的正则语言集合递归定义如下: 空语言Ø和空字符串语言{ε}是正则语言 每个a∈ ∑(a属于∑),单例语言{a}是一种正则语言 如

如何编写正则表达式来查找:

  • 阿巴
  • AAAAA
  • 阿阿巴巴阿
  • AAABBAAAA
  • AAAAA BBBBB AAAAA
规则:

  • 它总是以一个字母开始和结束
  • 它的中间总是有一个B
  • 第一组A,B组在中间,A组的第二组必须有相同数量的字母。
  • 必须一直有效到无穷大

    • 没有任何可能的正则表达式语言可以描述这一点,因为所描述的语言不是一种语言。 引用上面的维基百科链接:

      字母表∑上的正则语言集合递归定义如下:

      • 空语言Ø和空字符串语言{ε}是正则语言
      • 每个a∈ ∑(a属于∑),单例语言{a}是一种正则语言
      • 如果A和B是正则语言,那么A∪ B(并集)、A•B(串联)和A*(克莱恩星)是正则语言
      • 没有超过∑的其他语言是正则语言
      没有固定字符串、并集、连接或Kleene星形操作(必须为零或更多,没有进一步的约束)的组合可以描述上述情况,因为没有允许长度匹配断言的运算符。(类似地,允许反向引用的“regex”语言也不是真正的regex语言)


      因此,任何能够描述上述语言的“正则表达式语法”都不是真正的正则表达式语法。

      没有任何可能的正则表达式语言能够描述这一点,因为所描述的语言不是正则表达式语法。 引用上面的维基百科链接:

      字母表∑上的正则语言集合递归定义如下:

      • 空语言Ø和空字符串语言{ε}是正则语言
      • 每个a∈ ∑(a属于∑),单例语言{a}是一种正则语言
      • 如果A和B是正则语言,那么A∪ B(并集)、A•B(串联)和A*(克莱恩星)是正则语言
      • 没有超过∑的其他语言是正则语言
      没有固定字符串、并集、连接或Kleene星形操作(必须为零或更多,没有进一步的约束)的组合可以描述上述情况,因为没有允许长度匹配断言的运算符。(类似地,允许反向引用的“regex”语言也不是真正的regex语言)


      因此,任何能够描述上述语言的“正则表达式语法”都不是真正的正则表达式语法。

      下面的代码适用于上述场景,也适用于@Cary Swoveland所说的例外情况

      代码

      import re
      count = 0
      string = "AABBAA"
      for i in string:
          if i == string[0]:
              count +=1
          else:
              break
      #count = 2
      R = "^(A+)(B{" + str(count) + "})(\\1)$" #^(A+)(B{2})(\1)$
      #print(R)
      r = re.compile(R)
      print(re.findall(r, string))
      
      您必须计算字符串中
      A
      的出现次数,因为您希望模式与
      B
      数量相等的字符串相匹配

      输出

      [('AA', 'BB', 'AA')]
      
      string=“aaabbbaaa”


      输出
      []
      以下代码适用于上述场景,也适用于@Cary Swoveland所说的例外情况

      代码

      import re
      count = 0
      string = "AABBAA"
      for i in string:
          if i == string[0]:
              count +=1
          else:
              break
      #count = 2
      R = "^(A+)(B{" + str(count) + "})(\\1)$" #^(A+)(B{2})(\1)$
      #print(R)
      r = re.compile(R)
      print(re.findall(r, string))
      
      您必须计算字符串中
      A
      的出现次数,因为您希望模式与
      B
      数量相等的字符串相匹配

      输出

      [('AA', 'BB', 'AA')]
      
      string=“aaabbbaaa”


      输出
      []

      除了正则表达式
      ^(A+)(B+)\1$
      之外,您可以满足所有需求。例外情况是需要确认两个捕获组中字符串的大小相等。为此,我相信您需要一个单独的语句,例如
      $1.size==$2.size
      ,这取决于您使用的语言。@CarySwoveland我使用的是Python。这些声明是什么?我在谷歌上搜索,但还没找到答案。谢谢。您需要首先查看字符串是否匹配我给出的正则表达式(我应该编写
      r'^(A+)(B+)\1$'
      。如果存在匹配项,则需要使用Python代码测试捕获组1中字符串的长度是否等于捕获组2中字符串的长度。我认为需要获取匹配对象
      m
      ,并测试字符串
      m.group(0)
      是否等于字符串
      m.group(1)的大小
      。听众中是否有Pythonite?上述评论中提出的论点是正则表达式本身是不够的。在正则表达式完成后添加额外的代码进行检查并不能提供满足所有规定要求的正则表达式。(这可能是合适的;我认为不可能有一个完整的答案;对于真正的/标准化的ERE或BRE正则表达式表单,因此如果有人想声明其他内容,则需要非常小心如何解释“regex”一词)。您可以满足您的所有要求,但正则表达式
      ^(a+)(B+)\1$
      。例外情况是需要确认两个捕获组中字符串的大小相等。为此,我相信您将需要一个单独的语句,如
      $1.size==$2.size
      ,这取决于您使用的语言。@CarySwoveland我正在使用Python。这些语句是什么?我正在用谷歌搜索,但没有找到您需要首先查看字符串是否匹配我给出的正则表达式(我应该编写
      r'^(A+)(B+)\1$'
      。如果存在匹配项,则需要使用Python代码测试捕获组1中字符串的长度是否等于捕获组2中字符串的长度。我相信您需要获取匹配对象
      m
      ,并测试字符串的大小是否
      m.group(0)