Python以逻辑OR形式重新匹配两个连续的子串

时间:2018-04-27 14:58:46

标签: python regex python-2.7

我正在尝试编写一个匹配字符串

的正则表达式
"A","B","AB"

不匹配
"","AA","BB","BA"

我尝试了一个简单的模式

re.search(r'^(A)?(B)?',sample_str)

但这种模式与""匹配。 我知道许多解决方案可以通过对多个模式执行逻辑操作来匹配这个,但是可以使用单个模式进行匹配吗?

提前谢谢。

3 个答案:

答案 0 :(得分:0)

试一试。修改了此answer

中的一些正则表达式
regex statement = ^((?=A)A(B?)|(?=B)B)(?!.*(\w)\1)$

__

d = ['A', 'B', 'AB', '', 'AA', 'BB', 'BA']
for n in d:
     t = re.search('^((?=A)A(B?)|(?=B)B)(?!.*(\w)\1)$', n)
     print(t)

<_sre.SRE_Match object; span=(0, 1), match='A'>
<_sre.SRE_Match object; span=(0, 1), match='B'>
<_sre.SRE_Match object; span=(0, 2), match='AB'>
None
None
None
None

答案 1 :(得分:0)

似乎the anchor^)需要像这样删除

(A)?(B)?

Demo

如果您想要匹配ABAB,建议您尝试使用表达式AB|A|B Demo

答案 2 :(得分:0)

您提到当前解决方案的问题是它匹配空字符串。您还提到您不想重复撰写AB,这是当前解决方案所满足的。

在这种情况下,您可以通过positive lookahead排除空匹配,确保至少有一个字符匹配:

re.search(r'^(?=.)(A)?(B)?$',sample_str)

我还添加了字符串结尾锚$,以确保不允许使用尾随字符(您的AABB示例)。

regex101.com

中查看

当然,这假设无论正则表达式AB是什么,它们都不匹配空字符串。

(我刚注意到Wiktor Stribizew在评论中提出了类似的方法)