2015-09-01 3 views
-5

Я пытаюсь проанализировать длинную строку с использованием регулярного выражения в python. Строка такова:Разбор длинной строки в python

Output = "Name:AmelieAge:30Nationality:english" 

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

Output = "Name:AmelieAge:30Nationality:englishName:NikeAge:20Nationality:frenshName:davidAge:50Nationality:Irish" 

Я искал способ структурировали следующие данные:

Name:Amelie 
Age:30 
Nationality:english 

Name:David 
Age:50 
Nationality:Irish 

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

FYI: размер строка алеаторная

+0

делает строка всегда есть имя, возраст и национальность – The6thSense

+0

Do вы уже знаете имена полей? –

+0

Пожалуйста, сообщите нам, что вы пробовали. Это не кажется тяжелым, если вход не всегда похож на тот, который вы предоставили. –

ответ

2

Try:

>>> re.findall("[A-Z][a-z]+\:[\w\d][a-z\d]+", Output) 
['Name:Amelie', 'Age:30', 'Nationality:english'] 

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

+0

Это не удастся с таким составленным именем, как «Jean Pierre» –

+0

«Jean Pierre» уже неоднозначно, потому что вы можете понимать его также как Value Key, как в примере OP «AmelieAge» –

+0

, за исключением того, что 'Pierre 'не сопровождается символом': 'или концом строки. –

1
re.findall("[A-Z]\w+:[\d\w]+(?=[A-Z]\w+|$)", Output) 

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

Это позволит захватить группы правильно, даже в ситуациях, подобных рассказам @ bigOTHER.

0

Вы можете создать список словарей, как следует из строки:

import re, itertools 

Output = "Name:AmelieAge:30Nationality:englishName:NikeAge:20Nationality:frenshName:davidAge:50Nationality:Irish" 

entries = [] 
i_split = iter(re.split("(Name|Nationality|Age):", Output)[1:]) 

for entry in iter(lambda: list(itertools.islice(i_split, 6)), []): 
    i_entry = iter(entry) 
    d_entry = {k:next(i_entry) for k in i_entry} 
    entries.append(d_entry) 

# Display the whole list 
print entries 
print 

# Display entries one at a time 
for entry in entries: 
    for k, v in entry.items(): 
     print "{}:{}".format(k,v) 
    print 

Это даст вам выход:

[{'Nationality': 'english', 'Age': '30', 'Name': 'Amelie'}, {'Nationality': 'frensh', 'Age': '20', 'Name': 'Nike'}, {'Nationality': 'Irish', 'Age': '50', 'Name': 'david'}] 

Nationality:english 
Age:30 
Name:Amelie 

Nationality:frensh 
Age:20 
Name:Nike 

Nationality:Irish 
Age:50 
Name:david 
Смежные вопросы