В Python, как я могу удалить элементы из списка на основе списка строк? - PullRequest
1 голос
/ 26 апреля 2019

У меня есть список строк, из которых я хочу удалить элементы.У меня есть список ключевых слов, которые я ищу в этих элементах.Я не могу получить результат, который я ищу.Я не уверен, что регулярные выражения - правильный способ справиться с этим.
Я хочу, чтобы вывод был ['/ item / page / cat-dog', '/ item / page / animal-planet']

valid = ['/item/page/cat-dog', '/item/page/animal-planet', '/item/page/variable']
keywords = ['cat','planet']


for item in valid: 
    #a = re.findall()
    #

Ответы [ 3 ]

0 голосов
/ 26 апреля 2019

Насколько я понимаю, и на основании комментария @ dan-d вам нужно

[s for s in valid if not any(q in s for q in keywords)]
0 голосов
/ 27 апреля 2019

Как предлагается в комментариях и других ответах, оператор in может использоваться для проверки того, является ли строка подстрокой другой строки. Для данных примера в вопросе in - это самый простой и быстрый способ получить желаемый результат.

Если требуется соответствие '/ item / page / cat-dog', но не '/ item / page / catapult' - это соответствует только слову 'cat', а не только последовательности cat , тогда для сопоставления можно использовать регулярное выражение.

Шаблон для соответствия одному слову: '\bfoo\b', где '\b' обозначает границу слова.

Оператор чередования '|' используется для сопоставления с тем или иным шаблоном, например, 'foo|bar' соответствует 'foo' или 'bar'.

Построить шаблон, соответствующий словам в keywords; вызовите re.escape для каждого ключевого слова, если они содержат символы, которые механизм регулярных выражений может интерпретировать как метасимволы.

>>> pattern = r'|'.join(r'\b{}\b'.format(re.escape(keyword)) for keyword in keywords)
>>> pattern
'\\bcat\\b|\\bplanet\\b'

Скомпилировать шаблон в объект регулярного выражения .

>>> rx = re.compile(pattern)

Найдите совпадения: используя фильтр элегантно:

>>> matches = list(filter(rx.search, valid))
>>> matches
['/item/page/cat-dog', '/item/page/animal-planet']

Но обычно используется понимание списка :

>>> matches = [word for word in valid if rx.search(word)]
>>> matches
['/item/page/cat-dog', '/item/page/animal-planet']
0 голосов
/ 26 апреля 2019

Python поставляется с удобными ключевыми словами in и not in, чтобы проверить, находится ли объект в списке или нет.

для вашей проблемы вы можете просто сделать:

new_list = []
for item in valid: 
    if os.path.basename(item) not in keywords:
        new_list.append(item)

os.path.basename дает название файлов без дровосека.new_list тогда будет содержать все элементы valid, в которых имена файлов не были в keyword.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...