2015-12-18 2 views
2

У меня есть список:питона регулярного выражения находит матч в списке

chain_views = [u'x|frequency|x:y|||cbase', 
       u'x|frequency|x:y||weights_UK18|cbase', 
       u'x|frequency||y|weights_UK18|c%'] 

Я хочу, чтобы проверить состояние ниже по списку выше

if el.startswith('x|frequency|') and el.split('|')[4]!='' and el.split('|')[3]=='y': 

Как я могу преобразовать состояние выше в регулярном выражении?

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

for el in chain.views: 

    if el.startswith('x|frequency|') and el.split('|')[4]!='' and el.split('|')[3]=='y': 
     weighted_views = True 
     break 
    else: 
     weighted_views = False 

return weighted_views 
+0

Какова цель этого для цикла? он всегда возвращает результат «weighted_views» последнего элемента списка прямо сейчас. –

+1

Вы сбиваете с толку 'continue' с' break'? Продолжайте, просто выполните следующую итерацию, и это все равно. Кроме того, вы могли бы избежать вызова 'el.split ('|')' дважды. Я знаю, что это всего лишь пример кода, но все же стоит отметить. –

+0

Вы правы, я смущаю это! –

ответ

1

Поскольку строки выглядят как своего рода CSV, я предпочел бы работать с split функции и полностью избежать регулярных выражений.

for el in chain_views: 
    a0, a1, a2, a3, a4, a5 = el.split('|') # give better names 
    if a0 == 'x' and a1 == 'frequency' and a3 == 'y' and a4: 
     return True 
return False 
1

, если регулярные выражения, конечно, сделать жизнь проще

Я надеюсь, что это работает для вас

импорт повторно

х = [

u'x|frequency|x:y|||cbase', 
u'x|frequency|x:y||weights_UK18|cbase', 
u'x|frequency||y|weights_UK18|c%' 

]

t = "-". join (x) + '-'

x = re.findall (r '((?: x \ | \ w + \ | (?: x: y)? \ |) (? ! \ |) [^ -] *) +», т)

где х ваш новый список уже отфильтрованы

Смежные вопросы