Как переместить слова между начальным словом до новой строки '\ n'. и есть ли способ поставить условие «ИЛИ» при извлечении слов в python? - PullRequest
1 голос
/ 28 января 2020
{mtd: LAct, cId: _M_, cTy: 300}
cId: ['2', '103', '201', '202', '1', '101']
cTy: 428
mtd: PAct
cId: ['104']
cTy: 428
mtd: CAct
cId: ['104']
cTy: 428

Это такой текст, который у меня есть, и я хотел бы получить LAct, PAct, CAct и '2', '101' et c числа из квадрата скобки

Я пытаюсь что-то подобное на портале оценки regex (regex101.com)

(?<=cSId:).*?[\n]

Но это не работает, когда я использую то же самое в python (re module)

re.findall('((?<=contentSourceId:).*?[\n]',myst)

Два вопроса: 1. Как получить значения LAct, PAct, CAct 2. И есть ли способ поставить условие 'OR' для обработки нескольких сценариев 'cId', 'mtd' ios где Я только хочу получить номер, а не _M __

1 Ответ

1 голос
/ 28 января 2020

Вы можете использовать

\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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...