2015-03-02 3 views
-1

Я использую Python и пытаюсь понять, как использовать регулярные выражения. У меня есть список строк, как это:Извлечение строк из регулярного выражения Python

example = ['(string1)-(hello)', '(string2)-(world)'] 

, где у меня есть 2 строки закрытые скобки, отделенных ничем, поэтому я заинтересован только в том, что находится внутри(). Я хотел бы получить список строк:

example = ['string1', 'hello', 'string2' , 'world'] 

Любое предложение, как это сделать?

+1

Итерации в списке, для каждого элемента, '\ (. *? \)' - это то, что вы ищете. – Maroun

+0

Вы также можете посмотреть документы для re. [этот пример] (https://docs.python.org/2/library/re.html#finding-all-adverbs) может вам подойдет. – swenzel

ответ

4

Использование re.findall Функция наряду с list_comprehension.

>>> example = ['(string1)-(hello)', '(string2)-(world)'] 
>>> [x for i in example for x in re.findall(r'\(([^\)]*)\)', i)] 
['string1', 'hello', 'string2', 'world'] 
+2

Отличный компактный и читаемый рабочий пример. Хотя я буду выполнять 're.compile' заранее, так как производительность увеличивается, и я считаю ее более читаемой. – MariusSiuram

+0

@MariusSiuram Возможно читаемый, но не претендуйте на производительность до тех пор, пока вы их не приурочили: Python уже кэширует регулярные выражения и фактически использует 'timeit', я нахожу, что' python -m timeit -s 'import re "-s" example = ['(string1) - (hello)', '(string2) - (world)'] "-s" regex = re.compile (r '\ (([^ \)] *) \)') " "[x для i в примере для x в re.findall (regex, i)]" 'на самом деле медленнее, чем' python -m timeit -s 'import re "-s" example = [' (string1) - (hello) ',' (string2) - (world) '] "" [x для i в примере для x в re.findall (r' \ (([^ \)] *) \) ', i)] "' – Duncan

+0

I сделал заявления о производительности, потому что я только что их сделал :) – MariusSiuram