2015-11-24 2 views
2

У меня проблема false negative во время цикла в python.Найти точный элемент списка в строке

Вот мой список:

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 

как я могу соответствовать точному слову?

EDIT: проблема может быть, что db является OS зависимой так / может быть преобразована в \.

EDIT2: с @ Карой-Horvath решение:

преобразовать дб в списке:

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

петлевой элемент db во всем списке:

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

использовать регулярное выражение –

+0

Единственным способом я вижу, что это будет возможно, если вы разделяете точную строку, которую вы хотите для совпадения с первым. Поэтому разделите 'db' на' modello1', но вы считаете нужным, а затем сопоставляете его. – Noxeus

+2

Ну, проблема в том, что 'modello' * does * появляется в' db'; вы должны указать правила для сопоставления элемента 'l' в' db'. –

ответ

1

Используйте регулярные выражения или строковые функции для извлечения соответствующей части:

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

или (это был оригинальный ответ, работает только для путей Unix)

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

Теперь вы можете проверить точное соответствие:

m in l # True 
+0

Спасибо ...но проблема может заключаться в том, что программа, которую я пишу, будет запускаться также на машинах Windows, поэтому '' db'' может иметь обратную косую черту вместо обычных. В вашем ответе вы разделите '' db'', когда найдете ''/'' .. Извините, если я не так точен в моем вопросе .. – matteo

+0

OP хочет сопоставить элемент в списке с db, а не проверять db в списке – Hooting

+0

@Hooting: я не уверен, в чем проблема, он решает задачу , –

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 

Я думаю, теперь я понимаю, что ОП хотел бы точное совпадение:

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

Это не будет соответствовать modello.

+0

Последний абзац неправильно. По сути, вы воспроизвели ту же проблему. –

+0

согласился .. в этом случае у меня есть 2 выхода, в то время как мне нужно просто ** modello1 ** – matteo

+0

@KarolyHorvath Я не воспроизвел проблему. Я выделил, что два значения соответствуют, и я дал имя файла, с которым они сопоставляются. Если они просто хотят имя файла, я добавил пример. –

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

использование os, чтобы получить имя файла

0

Как об этом

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

не для всех платформ. – matteo

+0

Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, почему и/или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. – dotctor

Смежные вопросы