У меня есть str1 и str2 ниже, и я хочу использовать только одно регулярное выражение, которое будет соответствовать обоим. В случае str1 я также хочу иметь возможность фиксировать количество портов QSFP
>>> str1='''4 48 48-port and 6 QSFP 10GigE Linecard 7548S-LC'''
>>> str2='''4 48 48-port 10GigE Linecard 7548S-LC'''
>>>
Я хочу иметь возможность вводить числа «4», «48», «6» (если есть) и «7548». Но я не могу захватить "6" с помощью "?" метасимвол.
Когда я не использую метасимвол, захват работает для str1, но тогда я могу использовать это регулярное выражение, потому что оно не будет работать для str2:
>>> re.search(r'^(\d+)\s+(\d+)\s+.*(?:(\d+)\s+QSFP).*\s+(\d+)S-LC', str1, re.I|re.M).group(3)
'6'
>>>
Он работает, даже когда я использую знак «+» для обозначения одного вхождения, но, опять же, для str2 это не сработает:
>>> re.search(r'^(\d+)\s+(\d+)\s+.*(?:(\d+)\s+QSFP)+.*\s+(\d+)S-LC', str1, re.I|re.M).group(3)
'6'
>>>
Когда я использую "?" чтобы соответствовать 0 или 1 вхождению, захват не выполняется даже для str1:
>>> re.search(r'^(\d+)\s+(\d+)\s+.*(?:(\d+)\s+QSFP)?.*\s+(\d+)S-LC', str1, re.I|re.M).group(3)
>>>
\d
). Что ты на самом деле пытаешься сделать? - person geekosaur   schedule 15.04.2012re.search(r'(\d+)', str1).group(0)
достаточно. - person RanRag   schedule 15.04.2012