Как выполнить поиск в наборе (списке) с помощью оператора if с регулярным выражением

#python #python-3.x #search #set

#python #python-3.x #Поиск #set

Вопрос:

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

Я попробовал следующее:

 import re
search = re.compile('[edits')

if search in set(list):
   print('found')
  

Я создал список, в котором в качестве элемента указан «[редактировать интерфейсы]», но, похоже, он его не находит.

Комментарии:

1. «Я пытаюсь выполнить поиск по большому списку, и из того, что я понял, очень быстро использовать набор, а не обычный список». Это для тестирования членства на основе хэша. Если вам все равно придется перебирать все подряд, это не сэкономит вам времени.

Ответ №1:

Я думаю, это может быть то, что вы ищете

 search = re.compile('[edits')

l1 =  ["that", '[edit interfaces]', "that"]

for v in set(l1):
   if re.search(search, v):
       print('found '   v)
  

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

Комментарии:

1. На самом деле это не ускоряет процесс. Я имею в виду, потенциально, если было много дубликатов.

Ответ №2:

Я думаю, может быть, вы можете не изменять список на набор и вместо этого использовать встроенную функцию фильтра python.

 import re
search = re.compile('[edits')

l1 =  ["that", '[edit interfaces]', "that"]

res = filter(lambda x : re.search(search, x), l1)

print(list(res))
  

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

Комментарии:

1. Это то решение, которое вы искали?

2. Большое вам спасибо. Да, Филип. Я так думаю.. Оба ваших решения хороши. Мне просто интересно, какой из них самый быстрый… Из того, что вы говорите, похоже, что использование filter быстрее…

3. Почему элементы в списке исчезают после выполнения первого поиска?

4. >>> res = filter(лямбда x : re.search(поиск, x), l1) >>> len(список (res)) 1 >>> len(список (res)) 0

5. Это потому, что filter возвращает итератор. Когда вы вызываете list(результат), он в основном проходит через весь итератор (результатом является итератор). Итак, когда вы вызываете его во второй раз. Результатом является просто пустой итератор. Я надеюсь, что это разъяснение поможет.