Как извлечь набор подстрок из абзаца строки - PullRequest
0 голосов
/ 22 января 2019

Скажите, у меня есть строка:

output='[{  "id":"b678792277461" ,"Responses":{"SUCCESS":{"sh xyz":"sh xyz\\n  Name                             Age            Height   Weight\\n  Ana                    \\u003c15 \\u003e             163        47\\n                                                                     43\\n  DEB                       \\u003c23 \\u003e             155        \\n  Grey                            \\u003c53 \\u003e             143       54\\n                                                                     63\\n  Sch#"},"FAILURE":{},"BLACKLISTED":{}}}]'

Это только пример, но у меня гораздо более длинный вывод, который является ответом на вызов API. Я хочу извлечь все имена (ana, dab, grey) и поместить в отдельный список. как я могу это сделать?

json_data = json.loads(output)

json_data = [{'id': 'b678792277461', 'Responses': {'SUCCESS': {'sh xyz': 'sh xyz\n  Name                             Age            Height   Weight\n  Ana                    <15 >             163        47\n                                                                     43\n  DEB                       <23 >             155        \n  Grey                            <53 >             143       54\n                                                                     63\n  Sch#'}, 'FAILURE': {}, 'BLACKLISTED': {}}}]

1) Я пытался re.findall('\\n(.+)\\u',output)

но это не сработало, потому что там написано "неполная последовательность u"

2)

start = output.find('\\n')
end = output.find('\\u', start)
x=output[start:end]

Но я не мог понять, как запустить этот кусок кода в цикле для извлечения имен

Спасибо

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Объект \u не является буквой и не может быть сопоставлен. Это часть последовательности Unicode. Следующее регулярное выражение работает, но это немного странно. Он ищет начало каждой строки, кроме первой, до первого пробела.

output = json_data[0]['Responses']['SUCCESS']['sh xyz']

pattern = "\n\s*([a-z]+)\s+"
result = re.findall(pattern, output, re.M | re.I)
#['Name', 'Ana', 'DEB', 'Grey']

Объяснение шаблона:

  • начать с новой строки (\ n)
  • пропустить все пробелы, если есть (\ s *)
  • собрать одну или несколько букв ([a-z] +)
  • пропустить хотя бы один пробел (\ s +)

К сожалению, "Name" также распознается как имя. Если вы знаете, что он всегда присутствует в первой строке, нарежьте список результатов:

result[1:]
#['Ana', 'DEB', 'Grey']
0 голосов
/ 22 января 2019

Я использую regexr.com и играю с регулярным выражением, пока не получу правильное выражение, а затем преобразую его в Python.

https://regexr.com/

Я предполагаю, что \ nздесь символ новой строки, и я уверен, что ваша ошибка вызвана разрывом строки.Чтобы использовать многострочное совпадение в Python, вам нужно использовать этот флаг при компиляции.

\ n (. *) \ N - это будет жадным и захватит столько совпадений, сколько возможно (в примере это будетзахватить всю \ nAna через 54 \ n

[{"id": "678792277461", "Ответы": {Имя Возраст Рост Вес \ n Ana \ u00315 \ u003163 47 \ n 43 \ n Deb \ u00323\ u003155 60 \ n Серый \ u00353 \ u003144 54 \ n}]

import re
a = re.compile("\\n(.*)\\n", re.MULTILINE)
for responses in a.match(source):
    match = responses.split("\n") 
    # match[0] should be " Ana \u00315 \u003163 47"
    # match[1] should be " Deb \u00323 \u003155 60" etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...