Что-то туплю: если использовать match, или крышку в регулярке, то все работает как надо. Но если искать не с начала строки, почему (p)? выдает None, когда p есть? Если использовать (p?), то все нормально.
В чем тут соль ?
Непонятно где должен быть знак вопроса в скобках или снаружи.
import re
def test(regexp,string):
result = re.search(regexp,string)
if result:
print(result.group(0))
print(result.groups())
else:
print("None")
test(r'''^(p)?(\d{2})(?(1)m)''',"p11m")
print("----------------")
test(r'''^(p)?(\d{2})(?(1)m)''',"p11")
print("----------------")
test( r'''(p)?(\d{2})(?(1)m)''',"p11")
...
p11m
('p', '11')
----------------
None
----------------
11
(None, '11')