Regex с двойными скобками в python - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь проанализировать некоторые данные в следующей форме, которая называется data:

data = '(def-instance Adelphi
   (expenses thous$:7-10)
   (academic-emphasis biology))
(def-instance Arizona-State
   (expenses thous$:4-7)
   (academic-emphasis fine-arts))' 

Я хочу разбить данные на список таким образом, чтобы первый абзац был в первой записи, а второй - в вторая запись, например:

['(def-instance Adelphi
   (expenses thous$:7-10)
   (academic-emphasis business-administration)
   (academic-emphasis biology))', 
'(def-instance Arizona-State
   (expenses thous$:4-7)
   (academic-emphasis fine-arts)']

Я попытался с помощью команды re.split(r'\(*(\([^()]*\)*)*\)',data), но я немного отключился и не могу понять, почему. Помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Единственное, что объединяет разделяемые позиции, это то, что они заканчивают предыдущий «набор» ), имеют новую строку, а затем следующий «набор» начинается с ((. Это предполагает следующее, используя вид сзади и взгляд вперед:

import re

data = '''(def-instance Adelphi
   (expenses thous$:7-10)
   (academic-emphasis biology))
(def-instance Arizona-State
   (expenses thous$:4-7)
   (academic-emphasis fine-arts))'''

l = list(re.split(r'(?<=\)\))\s+(?=\()', data))
for item in l:
    print (item)
    print ()

с выводом (для ясности напечатанным в отдельных строках):

(def-instance Adelphi
   (expenses thous$:7-10)
   (academic-emphasis biology))

(def-instance Arizona-State
   (expenses thous$:4-7)
   (academic-emphasis fine-arts))
0 голосов
/ 19 марта 2020

Этого можно добиться, перебирая данные, выполняя поиск )) и создавая список результатов на основе найденного индекса и значений.

data = data.split('\n')

result = list()
prev = 0

for idx, value in enumerate(data):
    if '))' in value:
        result.append('\n'.join(data[prev:idx + 1]))
        prev = idx + 1

Это выводит:

print(result)
#['(def-instance Adelphi\n   (state newyork)\n   (control private)\n   (no-of-students thous:5-10)\n   (male:female ratio:30:70)\n   (student:faculty ratio:15:1)\n   (sat verbal 500)\n   (sat math 475)\n   (expenses thous$:7-10)\n   (percent-financial-aid 60)\n   (no-applicants thous:4-7)\n   (percent-admittance 70)\n   (percent-enrolled 40)\n   (academics scale:1-5 2)\n   (social scale:1-5 2)\n   (quality-of-life scale:1-5 2)\n   (academic-emphasis business-administration)\n   (academic-emphasis biology))', '(def-instance Arizona-State\n   (state arizona)\n   (control state)\n   (no-of-students thous:20+)\n   (male:female ratio:50:50)\n   (student:faculty ratio:20:1)\n   (sat verbal 450)\n   (sat math 500)\n   (expenses thous$:4-7)\n   (percent-financial-aid 50)\n   (no-applicants thous:17+)\n   (percent-admittance 80)\n   (percent-enrolled 60)\n   (academics scale:1-5 3)\n   (social scale:1-5 4)\n   (quality-of-life scale:1-5 5)\n   (academic-emphasis business-education)\n   (academic-emphasis engineering)\n   (academic-emphasis accounting)\n   (academic-emphasis fine-arts))']

И на ваш обновленный набор данных:

result
#['(def-instance Adelphi\n   (expenses thous$:7-10)\n   (academic-emphasis biology))', '(def-instance Arizona-State\n   (expenses thous$:4-7)\n   (academic-emphasis fine-arts))']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...