我在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
答案 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.basename
和os.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