Получил вот что:
import re
filename = 'tr.txt'
with open(filename,'r') as f:
ch = f.read()
pat = re.compile('createNode newnode -n ("\w+?_SET");(.*?)(?=createNode|\Z)',re.DOTALL)
pit = re.compile('^ *setAttr.+?("[^"\n]+").+("[^"\n]+");(?:\n|\Z)',re.MULTILINE)
dic = dict( (mat.group(1),dict(pit.findall(mat.group(2)))) for mat in pat.finditer(ch))
print dic
результат
{'"b_SET"': {'".test2"': '"ehmehm"', '".test1"': '"hmm"'}, '"a_SET"': {'".test2"': '"blablabla"', '".test1"': '"blabla"'}}
.
Вопрос:
что, если в строках должен быть символ '"'
? Как это представлено?
.
РЕДАКТИРОВАТЬ
Мне было трудно найти решение, потому что я не выбрал учреждение.
Вот новый шаблон, который улавливает ПЕРВУЮ строку "..."
и ПОСЛЕДНЮЮ строку "..."
, присутствующую после строки " setAttr"
и перед следующей " setAttr"
. Таким образом, может присутствовать несколько "..."
, а не только 3. Вы не спрашивали об этом условии, но я подумал, что оно может оказаться необходимым.
Мне также удалось сделать возможным наличие символов новой строки в строках, чтобы ловить "....\n......"
, а не только вокруг них. Для этого мне пришлось изобрести что-то новое: (?:\n(?! *setAttr)|[^"\n])
это означает: принимаются все символы, кроме '"'
и обычных newlines \n
, а также только символы новой строки, за которыми не следует строка, начинающаяся с ' *setAttr'
Для (?:\n(?! *setAttr)|.)
это означает: за новой строкой не следует строка, начинающаяся с ' *setAttr'
и всех остальных символов, отличных от новой строки.
Следовательно, любая другая специальная последовательность, такая как табуляция или что-то еще, автоматически принимается в сопоставлении.
ch = '''//Last modified: Sat, Apr 16, 2011 09:55:04 AM
//Codeset: ISO-8859-1
fileInfo "version" "20x64";
createNode newnode -n "a_SET";
addAttr -ci true -k true -sn "connections" -ln "connections" -dt "string";
setAttr -l on -k off ".tx";
setAttr -l on -k off ".ty";
setAttr -l on -k off ".sz";
setAttr -l on -k on ".test1" -type "string" "blabla";
setAttr -l on -k on ".test2" -type "string" "blablabla";
createNode newnode -n "b_SET";
addAttr -ci true -k true -sn "connections" -ln "connections" -dt "string";
setAttr -l on -k off ".tx";
setAttr -l on -k off ".ty";
setAttr -l on -k off ".sz";
setAttr -l on -k on ".test1" -type "string" (
"hmm bl
abla\tbla" );
setAttr -l on -k on ".tes\nt\t2" -type "string" "ehm\tehm";
setAttr -l on -k on ".test3" -type "string" "too
much" "pff" """ "feretini" "gol\nolo";
'''
import re
pat = re.compile('createNode newnode -n ("\w+?_SET");(.*?)(?=createNode|\Z)',re.DOTALL)
pot = re.compile('^ *setAttr.+?'
'"((?:\n(?! *setAttr)|[^"\n])+)"'
'(?:\n(?! *setAttr)|.)+'
'"((?:\n(?! *setAttr)|[^"\n])+)"'
'.*;(?:\n|\Z)',re.MULTILINE)
dic = dict( (mat.group(1),dict(pot.findall(mat.group(2)))) for mat in pat.finditer(ch))
for x in dic:
print x,'\n',dic[x],'\n'
результат
"b_SET"
{'.test3': 'gol\nolo', '.test1': 'hmm bl\n abla\tbla', '.tes\nt\t2': 'ehm\tehm'}
"a_SET"
{'.test1': 'blabla', '.test2': 'blablabla'}
person
eyquem
schedule
16.04.2011