在字符串中查找列表的确切项目

时间:2015-11-24 14:57:20

标签: python

我在python循环期间遇到 false negative 的问题。

这是我的清单:

l = ['modello', 'modello1', 'modello_old', 'new_modello']

那是一个字符串:

db = '/home/user/modello1.sqlite'

我想要做的是过滤db字符串并输出字符串中出现的列表元素。

因此结果应该只 modello1

这是我的循环:

for i in l:
    if i in db:
        print i

但结果不是我想要获得的结果:

modello
modello1

我该如何匹配确切的单词?

编辑:问题可能是db依赖于操作系统,因此可以在/中转换\

EDIT2 :@ Karoly-Horvath解决方案:

在列表中转换数据库:

db = [os.path.basename(db).replace('.sqlite', '')]

在整个列表中循环db的元素:

for i in db:
    if i in l:
        print i

4 个答案:

答案 0 :(得分:1)

使用正则表达式或字符串函数来提取相关部分:

m = os.path.basename(db).replace('.sqlite', '')  # 'modello1'

或(这是原始答案,仅适用于unix路径)

m = db.split('/')[-1].replace('.sqlite', '')     # 'modello1'

现在您可以检查完全匹配:

m in l   # True

答案 1 :(得分:1)

如果您想检查没有扩展程序的文件名,请使用os.path.basenameos.path.splitext

>>> from os import path
>>> s = '/home/user/modello1.sqlite'

>>> path.basename(s)
>>> 'modello1.sqlite'

>>> path.splitext(path.basename(s))
('modello1', '.sqlite')

>>> filename = path.splitext(path.basename(s))[0]
>>> filename
'modello1'

使用文件名:

>>> possibles = ['modello', 'modello1', 'modello_old', 'new_modello']
>>> for possible in possibles:
...     if possible in filename:
...         print possible, 'in', filename
modello in modello1
modello1 in modello1

如果您只是想检查是否有任何可能性匹配:

>>> if any(possible in filename for possible in possibles):
...     print filename
modello1

我想我现在明白OP会想要完全匹配:

>>> if filename in possibles:
...     print filename
modello1

这与modello不匹配。

答案 2 :(得分:1)

import os
db_basename = os.path.basename(db)
db_basename = os.path.splitext(db_basename)[0] # remove extension

使用os获取文件名

答案 3 :(得分:0)

这个怎么样

for i in l:
    if '/'+i+'.' in db:
        print i