Регулярное выражение если часть строки может отсутствовать
Есть строки следующего вида:
"M{A}{B}{C}", где
A- числа
B- пробелы; могут отсутствовать (если С отсутствует)
С- строки в скобках (т.е. вида "(текст_внутри_скобок)")
Каким регулярным выражением можно получить часть A, и текст внутри скобок части С?
Примеры:
| Строка | Результат |
|---------------------------------------|---------------------------------|
| "M01 (BlaBlaBla)" | ('01', 'BlaBlaBla') |
| "M205 (BlaBlaBla blablablaa)" | ('205', 'BlaBlaBla blablablaa') |
| "M10" | ('10', '') |
| "M190 (Текст внутри скобок)" | ('190', 'Текст внутри скобок') |
Я пользуюсь регулярным выражением r'^M(\d+).*\((.*)\)', но данное выражение не работает, если отсутствует часть C и приходиться делать дополнительные проверки
Ответы (1 шт):
Автор решения: Wiktor Stribiżew
→ Ссылка
Используйте
^M(\d+)(?:\s*\(([^()]*)\))?
Подробности
^- начало строкиM- символM(\d+)- Захватывающая подмаска №1: одна и более цифр(?:\s*\(([^()]*)\))?- необязательная незахватывающая подмаска:\s*- ноль и более пробельных символов\(- символ(([^()]*)- Захватывающая подмаска №2: ноль и более символов, отличных от(и)\)- символ).
import re
strings = ['M01 (BlaBlaBla)','M205 (BlaBlaBla blablablaa)','M10','M190 (Текст внутри скобок)']
rx = re.compile(r'^M(\d+)(?:\s*\(([^()]*)\))?')
for s in strings:
m = rx.search(s)
if m: print(m.groups())
Результат:
('01', 'BlaBlaBla')
('205', 'BlaBlaBla blablablaa')
('10', None)
('190', 'Текст внутри скобок')