在Python中,如何基于字符串列表从列表中删除项目?

时间:2019-04-26 14:48:55

标签: python regex list

我有一个要从中删除项目的字符串列表。我在这些项目中有要搜索的关键字列表。我似乎无法获得所需的输出。我不确定正则表达式是否是处理此问题的正确方法。
我希望输出为['/ 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 :(得分:0)

Python附带了方便的关键字innot 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中的元素。

答案 1 :(得分:0)

据我了解,根据@dan-d's comment,您需要的是

[s for s in valid if not any(q in s for q in keywords)]

答案 2 :(得分:0)

如评论和其他答案中所建议,in运算符可用于检查一个字符串是否是另一个字符串的子字符串。对于问题中的示例数据,使用in是获得所需结果的最简单,最快的方法。

如果要求匹配“ / item / page / cat-dog”而不匹配“ / item / page / catapult”,则仅匹配 word “ 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'

将模式编译为regular expression object

>>> rx = re.compile(pattern)

找到匹配项:使用filter很不错:

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

但是通常使用list comprehension

>>> matches = [word for word in valid if rx.search(word)]
>>> matches
['/item/page/cat-dog', '/item/page/animal-planet']