2013-06-12 2 views
1

У меня сложная строка и хотелось бы попытаться извлечь из нее несколько подстрок.Извлечение нескольких подстрок из строки

Строка состоит из набора элементов, разделенных запятыми. Каждый элемент имеет идентификатор (id-n) для пары слов, внутри которой заключены скобки. Я хочу получить только слово внутри скобки, у которого есть число, прикрепленное к его концу (например, «Это-1»). Фактически это число указывает положение того, как слова должны быть созданы после извлечения.

#Example of how the individual items would look like 
id1(attr1, is-2) #The number 2 here indicates word 'is' should be in position 2 
id2(attr2, This-1) #The number 1 here indicates word 'This' should be in position 1 
id3(attr3, an-3) #The number 3 here indicates word 'an' should be in position 3 
id4(attr4, example-4) #The number 4 here indicates word 'example' should be in position 4 
id5(attr5, example-4) #This is a duplicate of the word 'example' 

#Example of string - this is how the string with the items looks like 
string = "id1(attr1, is-1), id2(attr2, This-2), id3(attr3, an-3), id4(attr4, example-4), id5(atttr5, example-4)" 

#This is how the result should look after extraction 
result = 'This is an example' 

Есть ли более простой способ сделать это? Regex не работает для меня.

+2

Я не могу понять смысл вашего примера. Не могли бы вы описать его по-другому? – DaoWen

+0

@ DaoWen - Извините, что сама строка немного сложна. Трудно описать это. – Cryssie

+0

Что регулирует переупорядочение предметов? –

ответ

2

Тривиальным/наивный подход:

>>> z = [x.split(',')[1].strip().strip(')') for x in s.split('),')] 
>>> d = defaultdict(list) 
>>> for i in z: 
... b = i.split('-') 
... d[b[1]].append(b[0]) 
... 
>>> ' '.join(' '.join(d[t]) for t in sorted(d.keys(), key=int)) 
'is This an example example' 

Вы дублировали позиции для example в вашей выборки строки, поэтому example повторяется в коде.

Тем не менее, ваш пример не соответствует вашим требованиям - но эти результаты соответствуют вашему описанию. Слова упорядочены в соответствии с их показателями положения.

Теперь, если вы хотите избавиться от дубликатов:

>>> ' '.join(e for t in sorted(d.keys(), key=int) for e in set(d[t])) 
'is This an example' 
+0

'example' повторяется, но это не то, что хочет OP. – nhahtdh

+0

хорошо, если вы хотите быть техническим, его пример на самом деле не то, что он хочет, так как слова переключаются. –

+0

Я бы взял это как опечатку. Но требование о том же положении указано довольно четко. – nhahtdh

2

Почему не регулярное выражение? Это работает.

In [44]: s = "id1(attr1, is-2), id2(attr2, This-1), id3(attr3, an-3), id4(attr4, example-4), id5(atttr5, example-4)" 

In [45]: z = [(m.group(2), m.group(1)) for m in re.finditer(r'(\w+)-(\d+)\)', s)] 

In [46]: [x for y, x in sorted(set(z))] 
Out[46]: ['This', 'is', 'an', 'example'] 
+0

Вам не удалось обнаружить, что 'example' повторяется (такое же положение 4), и только один из них должен быть сохранен. – nhahtdh

+0

ОК, я пересмотрел вопрос о заимствовании '' set'' из ответа Бурана. –

1

ОК, как об этом:

sample = "id1(attr1, is-2), id2(attr2, This-1), 
      id3(attr3, an-3), id4(attr4, example-4), id5(atttr5, example-4)" 


def make_cryssie_happy(s): 
    words = {} # we will use this dict later 
    ll = s.split(',')[1::2] 
    # we only want items like This-1, an-3, etc. 

    for item in ll: 
     tt = item.replace(')','').lstrip() 
     (word, pos) = tt.split('-') 
     words[pos] = word 
     # there can only be one word at a particular position 
     # using a dict with the numbers as positions keys 
     # is an alternative to using sets 

    res = [words[i] for i in sorted(words)] 
    # sort the keys, dicts are unsorted! 
    # create a list of the values of the dict in sorted order 

    return ' '.join(res) 
    # return a nice string 


print make_cryssie_happy(sample) 
Смежные вопросы