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