查找“ABA”、“AABBAA”或“aaabbbaa”的正则表达式(直到无穷大)

2024-09-28 19:34:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  • 阿巴
  • AAAAA
  • 阿阿巴巴阿
  • AAABBAAAA
  • AAAAA BBBBB AAAAA

规则:

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

Tags: 数量规则字母aaaaabbbbbaaabbaaaa
2条回答

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

The collection of regular languages over an alphabet Σ is defined recursively as follows:

  • The empty language Ø, and the empty string language {ε} are regular languages.
  • For each a ∈ Σ (a belongs to Σ), the singleton language {a} is a regular language.
  • If A and B are regular languages, then A ∪ B (union), A • B (concatenation), and A* (Kleene star) are regular languages.
  • No other languages over Σ are regular.

没有固定字符串、并集、连接或Kleene星形操作(必须为零或更多,没有进一步的约束)的组合可以描述上述情况,因为没有允许长度匹配断言的运算符。(类似地,允许反向引用的“regex”语言也不是真正的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 = "AAABBBBBBAAA"

输出[]

相关问题 更多 >