#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
на самом деле это разные слова.