我有标签ID ABxxx,其中x是任意数字。在此标记中,AB之前可以有空格,之后(AB)之间可以有无限空格,或者有AB_。见下面的列表。
(AB)_xxx
(AB)_xxx
AB_xxx
(AB) xxx
ABxxx
我想为每个标签获取元组对。我创建了一个表达式来获取它们。
tag=re.compile(r'\s*\(*(AB)\)*\s*\_ (\d{2,3})\s*$',re.VERBOSE).match('AB_678').groups()
print(tag)
结果为('AB', '678')
。
但现在我想排除以下格式:
(AB_xxx
AB xxx
我通过包含非捕获组语法和OR运算符来调整re
语句。
tag=re.compile(r'^\s*(?:(AB | \(AB\)\s* | AB\_ | \(AB\)\_)) (\d{2,3})\s*$',re.VERBOSE).match('(AB)_678').groups()
print(tag)
尝试(AB_xxx
后,它给了我错误,我想要的。除非我尝试了可接受的条件,否则它将在我的元组中包含()或_。
例如:'(AB)_678'
会产生('(AB)_', '678')
我理解我正在使用?:
来表示整个AB
或语句,这就是为什么它会拉出额外的非特殊字符。
我尝试围绕每个条件放置()但现在它为每个条件提供了额外的元组元素:(None, None, 'AB', None, '678')
。
tag=re.compile(r'^\s*(?:(AB) | \((AB)\)\s* | (AB)\_ | \((AB)\)\_) (\d{2,3})\s*$',re.VERBOSE).match('AB_678').groups()
print(tag)
不太确定去哪里。到目前为止我有正确的方法吗?