Python разделяет строки между » » » в массив значений

#python #json #regex

#python #json #регулярное выражение

Вопрос:

Здесь немного сложно, может пригодиться некоторый опыт.

Пример строки:

(Здесь огорожена одна строка, но многострочный код, поэтому он не исчезает с экрана)

message_string = '{"Message": "Lab Test Type "thing1 [Phase 1]" requires the following additional Lab Test Types to be recorded when Passing: "thing2 (ug/g) [Phase 1]", "thing3 (pass/fail [Phase 1]", "thing4 (pass/fail) [Phase 1]", "thing5 (pass/fail) [Phase 1]"."}'

Желаемое состояние:

 [
    "thing2 (ug/g) [Phase 1]", 
    "thing3 (pass/fail) [Phase 1]", 
    "thing4 (pass/fail) [Phase 1]", 
    "thing5 (pass/fail) [Phase 1]"
]
 

Попробовал регулярное выражение:

 import re

split_message = re.split('\"([^\"]*)\",', message_string)
 

Результаты:

 [
    '{"Message": "Lab Test Type "thing1 [Phase 1]" requires the following additional Lab Test Types to be recorded when Passing: ',
    'thing2 (ug/g) [Phase 1]',
    ' ',
    'thing3 (pass/fail) [Phase 1]',
    ' ',
    "thing4 (pass/fail) [Phase 1]",
    ' ',
    "thing5 (pass/fail) [Phase 1]"."}'
]
 

Вопросы:

  • Как мне удалить начальный {"Message... элемент?, все пробелы ( ' ' ) и последний ."} , чтобы остался только массив с things ?

РЕДАКТИРОВАТЬ 1:

  • Я должен был быть более четким в примере. thing1, thing2, thingN может быть любой строкой; на самом деле это разные слова.
  • решение @ anubhava мне ближе всего.
  • Мне непонятно, почему мне нужно окружать message_string r''' ... ''' . Придется провести повторный поиск, поскольку я раньше не сталкивался с этим синтаксисом при работе с Python.
  • Вероятно, мне понадобится отрицательный прогноз для исключения thing1 из результатов.

Комментарии:

1. Не используйте split . Используйте re.findall(r'\"(.*?)\"', string)

2. Эта примерная строка — JSON. Расшифруйте его, выполните цикл, а затем примените регулярное выражение к вашей проблеме.

3. Смотрите ideone.com/wQgofX

Ответ №1:

почему бы не попробовать эти re.findall("thing[^[]*([^]]*]", message_string)

Комментарии:

1. Опять же, хотелось бы попробовать, но thing это не обычное слово в реальной строке. Я предоставил плохой образец.

Ответ №2:

re.findall отлично справляется с работой.

 import re

message_string = '{"Message": "Lab Test Type "thing1 [Phase 1]" requires the following additional Lab Test Types to be recorded when Passing: "thing2 (ug/g) [Phase 1]", "thing3 (pass/fail) [Phase 1]", "thing4 (pass/fail) [Phase 1]", "thing5 (pass/fail) [Phase 1]"."}'
result = re.findall('thing[0-9] ([a-z]*/[a-z]*) [Phase [0-9]]',message_string)  
print(result)
 

Выход:

 [
    "thing2 (ug/g) [Phase 1]", 
    "thing3 (pass/fail) [Phase 1]", 
    "thing4 (pass/fail) [Phase 1]", 
    "thing5 (pass/fail) [Phase 1]"
]
 

Комментарии:

1. Он не возвращает все значения, которые хочет OP.

2. Приношу свои извинения за то, что в примере не было ясности. thing1, thing2, thingN на самом деле это разные слова.