我正在尝试编写一个匹配字符串
的正则表达式"A","B","AB"
与
不匹配"","AA","BB","BA"
我尝试了一个简单的模式
re.search(r'^(A)?(B)?',sample_str)
但这种模式与""
匹配。
我知道许多解决方案可以通过对多个模式执行逻辑操作来匹配这个,但是可以使用单个模式进行匹配吗?
提前谢谢。
答案 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)
答案 2 :(得分:0)
您提到当前解决方案的问题是它匹配空字符串。您还提到您不想重复撰写A
和B
,这是当前解决方案所满足的。
在这种情况下,您可以通过positive lookahead排除空匹配,确保至少有一个字符匹配:
re.search(r'^(?=.)(A)?(B)?$',sample_str)
我还添加了字符串结尾锚$
,以确保不允许使用尾随字符(您的AA
和BB
示例)。
当然,这假设无论正则表达式A
和B
是什么,它们都不匹配空字符串。
(我刚注意到Wiktor Stribizew在评论中提出了类似的方法)