<p>使用嵌套组:用另一个paren组包装整个子字符串,将其更像是“原子”的东西,并保留您开始使用的paren组以匹配零件:</p>
<pre><code>>>> s = '230030215840▒Cumul Arte▒pl▒PROGRAMME_WEB▒SCI_nauka▒075631-006-A▒TV▒1'
>>> re.search(r'((\d{6}-\d{3})-([A-Z]))', s).groups()
('075631-006-A', '075631-006', 'A')
>>> re.search(r'((\d{6}-\d{3})-([A-Z]))', s).groups()[1:]
('075631-006', 'A')
</code></pre>
<p>这样,如果整个类似<code>075631-006-A</code>的子字符串不存在,则MatchObject将为None,从而引发错误:</p>
<pre><code>>>> re.search(r'((\d{6}-\d{3})-([A-Z]))', '075631-006-__BAD__').groups()[1:]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'
</code></pre>
<p>然后,更完整的解决方案如下所示:</p>
<pre><code>rx = re.compile(r'((\d{6}-\d{3})-([A-Z]))')
match = rx.search(input)
if match:
# all 3 groups are present here
part1, part2 = match.groups()[1:]
</code></pre>
<p>希望这有帮助</p>
<p>编辑
另一种变体是使用非捕获paren组。根据你的口味,它增加或减少清晰度-切片<code>[1:]</code>是不需要的,但同时你使用这个时髦的<code>(?:....)</code><a href="https://docs.python.org/2/library/re.html#regular-expression-syntax" rel="nofollow noreferrer">regexp syntax</a>:</p>
<pre><code>rx = re.compile(r'(?:(\d{6}-\d{3})-([A-Z]))')
match = rx.search(input)
if match:
part1, part2 = match.groups()
</code></pre>