如何编写正则表达式来查找:
- ABA
- AABBAA
- 啊啊啊啊啊
- 啊啊啊啊啊啊
- AAAABBBBBAAAAAA
规则:
- 它总是以 A 开头和结尾
- 中间总是有一个B
- 第一组 A、中间的一组 B、第二组 A 的字母数量必须相同。
- 必须一直有效到无穷大
没有可能的正则表达式语言可以描述这一点,因为所描述的语言不是常规语言。 引用上面的维基百科链接:
字母 Σ 上的常规语言集合递归定义如下:
- 空语言 Ø 和空字符串语言 {ε} 是常规语言。
- 对于每个 a ∈ Σ(a 属于 Σ),单例语言 {a} 是正则语言。
- 如果 A 和 B 是正则语言,则 A ∪ B(并集)、A • B(串联)和 A*(Kleene 星号)是正则语言。
- 没有其他超过 Σ 的语言是常规的。
没有固定字符串、联合、连接或 Kleene-star 操作(在没有进一步约束的情况下必须是零个或多个)的组合可以描述上述内容,因为没有允许长度匹配断言的运算符。(同样,允许反向引用的“正则表达式”语言也不是真正的正则表达式语言)。
因此,任何可以描述上述语言的“正则表达式语法”都不是真正的正则表达式语法。
下面的代码适用于上述场景,除了@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(s)的字符串。
输出
[('AA', 'BB', 'AA')]
什么时候string = "AAABBBBBBAAA"
输出 []