2014-11-25 3 views
0

Я пытаюсь извлечь часть многострочной строки. В частности, я хотел бы, чтобы вытащить список терминов, между центральной парой фигурных скобок:соответствие python по нескольким строкам

'my datagroup 2.5 {\n nose-capabilities {\n  none\n  slow\n  800\n  1200\n }\n}\n' 

Я попытался это:

re.findall('.*{.*{(?:\s*(\S+)\s*)*}\s*}', d, re.S) 

# ['1200'] 

Так что я только получать последний захват как насколько я могу судить. ?

+0

Каковы ваши ожидаемые результаты? – hwnd

+1

Что вы ищете? – Arovit

+0

Я хочу это из строки: ['none', 'slow', '800', '1200'] –

ответ

1

Я думаю, вы пропустили точку findall. Он возвращает одно значение для каждого совпадения всего шаблона. Если вам нужно несколько групп в одном шаблоне, это нормально, но для этого вам не нужно findall.

Фактически, вам это действительно не нужно. Вы можете просто заменить всю середину своего шаблона (.*?), чтобы тривиально захватить все, что находится между второй открытой фигурной скобкой и первой скобой.

Обратите внимание на нежелательное соответствие; в противном случае он всасывал бы все до последние замыкает скобку, а не до сначала. (. Вы можете использовать опережение утверждения для этого, но не жадные матчей проще)

>>> re.findall('.*{.*{(.*?)}', d, re.S) 
['\n  none\n  slow\n  800\n  1200\n '] 

Хотя конечно findall еще не делает вам никакой пользы:

>>> re.search('.*{.*{(.*?)}', d, re.S).group(1) 
'\n  none\n  slow\n  800\n  1200\n ' 

Во всяком случае, как только вы есть, что вы можете просто split это:

>>> re.search('.*{.*{(.*?)}', d, re.S).group(1).split() 
['none', 'slow', '800', '1200'] 
2

Если вы пытаетесь сделать это с помощью регулярного выражения, вам будет лучше использовать re.search и утверждение lookahead.

>>> re.search(r'(?s){(?!.*{)([^}]*)', d).group(1).split() 
['none', 'slow', '800', '1200'] 
0

Ответ на любое количество вложенных скобок:

s = 'my datagroup 2.5 {\n nose-capabilities {\n  none\n  slow\n  800\n  1200\n }\n}\n' 
# the position of the inner brace 
start = s.rfind('{') + 1 
end = s.find('}') 
# find alphanumeric characters in substring 
re.findall('\w+', s[start:end]) 
Смежные вопросы