2016-06-04 4 views
0

У меня есть строки, какИспользование регулярных выражений для извлечения данных из следующей строки

st = " * ** abc * def ghi **abc* mn*" 

Я хотел бы, чтобы извлечь список, содержащий уникальные элементы между * с, что в этом случае будет:

['abc', 'def ghi', 'mn'] 

Мой подход:

se = set([x.strip() for x in re.split('\*+', st)]) 
se.discard('') 
l = list(se) 

Я новичок в регулярных выражениях. Есть ли лучший способ сделать это?

+0

Почему вы конвертируете обратно в список после? –

+2

лучше в каком смысле? лучше субъективный термин .. – rock321987

+0

Вы хотите сохранить заказ? – schwobaseggl

ответ

2

Вы могли бы это сделать в одном операторе:

se = list(set([x.strip() for x in re.split('\*+', st)]) - {''}) 

Это не обязательно должен быть более предпочтительным, чем ваше решение для удобства чтения, однако.

+1

Вот еще более короткий «список» (set (re.split ('[*] * \ * *', st)) - {''}) '. Но это явно не очень хорошее решение, потому что его так трудно читать. –

-3

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

import re 

st = " * ** abc * def ghi **abc* mn*" 

mystrs = re.compile('\w+') 
allstrs = re.findall(mystrs, st) 
print allstrs 

Выход:

[ 'ABC', 'Защиту', 'ГХИ', 'ABC', 'тп']

+0

Это разделяет «def» и «ghi»! – schwobaseggl

+0

Мой ответ пересек с одним из @holdenweb, его решение кажется более подходящим для ваших нужд. – Ramu

+0

Это не дает правильного выхода. '['abc', 'def ghi', 'mn']' –

1

Нет необходимости запустить регулярное выражение двигатель:

testcase = " * ** abc * def ghi **abc* mn*" 
list(set(s.strip() for s in testcase.split("*")) - {''}) 
+0

Yeh, я сформулировал решение на основе полосы, прежде чем я наткнулся на трюк '- {" "}', чтобы удалить пустые контейнеры. – holdenweb

+0

Возможно, вам понравится [Шаблоны Python - Анекдот оптимизации] (https://www.python.org/doc/essays/list2str/) – holdenweb

0

Как об этом:

>>> st = " * ** abc * def ghi **abc* mn*" 
>>> 
>>> list(set(x.strip() for x in st.split('*') if x.strip())) 
['mn', 'def ghi', 'abc'] 

Или если вы prefe r к использованию функций, то:

>>> st 
' * ** abc * def ghi **abc* mn*' 
>>> l = [] 
>>> def f(x): 
     x = x.strip() 
     if x: 
      return x 


>>> for elem in st.split('*'): 
     x = f(elem) 
     if x and x not in l: 
      l.append(x) 


>>> l 
['abc', 'def ghi', 'mn'] 
Смежные вопросы