Вы можете использовать
\b(?:cId|mtd):\s*(\[[^][]+]|[^\W_]+)
, чтобы извлечь нужные значения, а затем проверить, начинается ли захваченный текст с [
, и соответственно проанализировать результат.
ПРИМЕЧАНИЕ : Это решение re
+ ast
будет работать только в том случае, если значения внутри [...]
всегда являются известными, разделенными запятыми числами, заключенными в одинарные кавычки.
См. Демонстрационную версию regex :
\b
- граница слова (?:cId|mtd)
- cId
или mtd
:
- двоеточие \s*
- 0+ пробелов (\[[^][]+]|[^\W_]+)
- группа 1 (возвращается значение re.findall
, остальное рассматривается как контекст): \[[^][]+]
- [
, 1+ символов, отличных от [
и ]
, а затем ]
|
- или [^\W_]+
- 1 или более alphanumeri c символов
См. Python демо
import re, ast
text = "{mtd: LAct, cId: _M_, cTy: 300}\n cId: ['2', '103', '201', '202', '1', '101']\n cTy: 428\n mtd: PAct\n cId: ['104']\n cTy: 428\n mtd: CAct\n cId: ['104']\n cTy: 428"
res = [];
for m in re.findall(r"\b(?:cId|mtd):\s*(\[[^][]+]|[^\W_]+)", text):
if m.startswith("["):
res.append(ast.literal_eval(m.replace("'", '')))
else:
res.append(m)
print(res) # => ['LAct', [2, 103, 201, 202, 1, 101], 'PAct', [104], 'CAct', [104]]
Если вам нужно ['LAct', 2, 103, 201, 202, 1, 101, 'PAct', 104, 'CAct', 104]
, в качестве результата используйте res.extend(ast.literal_eval(m.replace("'", '')))
, см. this Python demo .