2015-04-17 3 views
1

У меня есть список, содержащий Python Юникод строка:Regex чтобы соответствовать различным строкам в списке

mylist = [ 
    u'Path:path\\to\\some\\file.html\n user ID: a.b.c\n', 
    u'Path:somewhat\\longer\\path\\to\\some\\file.jpeg\n user ID: a:b_c\n someotherID:x:x:x\n' 
] 

Мне нужно извлечь только последнюю часть пути: в этом случае file.html и file.jpeg. Есть ли какое-либо всеобъемлющее regex, чтобы получить эту информацию из моего списка?

+0

Не хотите сказать 'file.jpeg' вместо' file.img'? – funkwurm

+0

О, да, спасибо за указание, что вне – Tania

+0

или '[re.match (r '(? M) Путь:. * \\ ([^ \\\ n] *) $', i) .группа (1) для i в моем списке] ' –

ответ

2

Если вы используете ntpath вместо os.path вы получите правильное поведение без трясущихся регулярных выражений:

>>> import ntpath 
>>> [ntpath.basename(entry.split('\n')[0]) for entry in mylist] 
[u'file.html', u'file.jpeg'] 

В отличие от того, что говорит @Kasra, ваши пути действительны, они просто происходят из другой операционной системы.

+0

Это работает отлично, но есть ли регулярное выражение, которое может сделать то же самое? – Tania

+1

@Tania Да и нет. Не могли бы вы написать регулярное выражение, чтобы сделать это правильно? Да. Это хорошая идея? Нет, я так не думаю. Если вы пишете регулярное выражение, вы пишете код специально для решения этой конкретной проблемы, имеющейся у вас прямо сейчас. Если что-то о пути изменится по строке, ваше регулярное выражение может не справиться с этим. Используя базовое имя, ваш код будет работать до тех пор, пока вы запускаете его по пути. – kqr

1

Вам не нужно регулярное выражение, вы можете использовать os.path, но сначала вам нужно заменить \ с / затем использовать path.basename:

>>> from os import path 
>>> [path.basename(i.split()[0].replace('\\','/')) for i in mylist if i] 
[u'file.html', u'file.jpeg'] 
+0

Мои пути действительны @Kasra. Они просто происходят из разных os. На самом деле они являются строками unicode и разделены как путь \\ to \\ what \\ – Tania

+0

@Tania Да, я понял! ;) – Kasramvd

+0

Спасибо. Но это решение не работает, когда в список входит лишнее пустое поле. Выбрасывает исключение из диапазона – Tania

1
for path in path_list: 
    # assuming each item in the list actually contains a path 
    print re.search(r'Path:(?:.*?\\)(\w+\.\w+)', path).group(1) 
+0

Спасибо Малик, этот тоже работает. Спасибо за удивительное регулярное выражение. – Tania

+0

В любое время я рад, что смогу помочь. –